Подтвердить что ты не робот

Хотите узнать Objective-C, но синтаксис очень запутан

Исходя из фона Java, я предполагаю, что это ожидается. Мне бы очень хотелось узнать Objective-C и начать разработку приложений для Mac, но синтаксис просто убивает меня.

Например:

-(void) setNumerator: (int) n
{
    numerator = n;
}

Что это за черта и почему в скобках следует пустое? Я никогда не видел void в скобках в C/С++, Java или С#. Почему у нас нет точки с запятой после (int) n? Но мы имеем его здесь:

-(void) setNumerator: (int) n;

И что с этим процессом alloc, init, release?

myFraction = [Fraction alloc]; 
myFraction = [myFraction init];
[myFraction release];

И почему он [myFraction release];, а не myFraction = [myFraction release];?

И наконец, что с символами @и что эта реализация эквивалентна Java?

@implementation Fraction

@end

В настоящее время я читаю Программирование в Objective C 2.0, и это просто разочаровывает изучение этого нового синтаксиса для кого-то в фоне Java.

ОБНОВЛЕНИЕ 1: После прочтения всех этих ответов и программирования в Objective C 2.0 немного дальше, все это начинает иметь смысл сейчас!

ОБНОВЛЕНИЕ 2: Спасибо за большой совет "поддержка-многоязычность". Мы можем объединить эти два утверждения в один так:

myFraction = [Fraction alloc]; 
myFraction = [myFraction init];

Может быть уменьшено до:

myFraction = [[Fraction alloc] init]; 
4b9b3361

Ответ 1

Что это за черта и почему за ней следует void в скобках?

Тире - означает "уровень экземпляра" (который по умолчанию используется в Java). Когда вы видите знак плюса +, это означает уровень класса (такой же, как использование static в Java)

В круглых скобках указывается тип возвращаемого значения.

Почему у нас нет точки с запятой после (int) n? Но мы имеем его здесь:

-(void) setNumerator: (int) n;

Поскольку это сигнатура метода, вы можете думать об этом как о интерфейсе:

 interface YourClass {
      void setNumerator(int n );// see? semicolon
 }

Такая же ситуация.

Objective-C, имеющий корни в C (на самом деле это реальный C с объектами), требуется файл заголовка (полностью удаленный в Java), где вы определяете, какие функции/методы будет иметь ваш класс.

Эквивалентным, если такая вещь будет существовать в java, будет:

// YourClass.java.h 

 interface YourClass {
      void setNumerator(int n );
 }
 // YourClass.java.m
 class YourClass {
      void setNumerator( int n ) {
       this.n = n;
      }
  }

И что с этим процессом alloc, init, release?

myFraction = [Fraction alloc]; 
myFraction = [myFraction init];
[myFraction release];

allo-init является эквивалентом для new в Java, alloc, когда вы запрашиваете память для своего объекта, alloc запрашиваете память и init вызывает метод init, эквивалентный Java класс конструктора (btw Ruby делает тот же за сценами)

Нет эквивалента выпуску на Java, потому что это сбор мусора, в Objective-C вам нужно освободить свой объект.

Кстати, инициализация также может быть myFraction = [[Fraction alloc]init];

И наконец, что с символами @и что эта реализация эквивалентна Java?

 @implementation Fraction

 @end

Это определение класса, как я упоминал ранее.

В настоящее время я читаю "Программирование в Objective C 2.0", и это просто разочаровывает изучение этого нового синтаксиса для кого-то на фоне Java.

Вот связанный ответ, который поможет вам лучше ознакомиться с квадратными скобками:

Краткая история "квадратных скобок" - это я помню.

Ответ 2

Возможно, есть wizz через wiki-страницу для Objective-C. Я просто сделал и нашел большинство ваших ответов.

http://en.wikipedia.org/wiki/Objective-C

Я тоже из java-фона, при первом взгляде objectivec выглядит не слишком сексуально.

Похоже на С++ с небольшими битами синтаксиса на нем.

Что это за черта и почему в скобках следует пустое?

минус здесь обозначает метод экземпляра, плюс обозначает метод класса

Я никогда не видел void в скобках в C/С++, Java или С#.

это тип возврата

Почему у нас нет точки с запятой после (int) n?

Если вы не предоставляете тело метода, синтаксис является объявлением метода, а не реализацией.

И наконец, что с символами @и что эта реализация эквивалентна Java?

@implementation Fraction

@end

в java, вероятно, будет

public class Fraction {

}

Ответ 3

Из той же книги знак "-" сообщает компилятору, что метод является методом экземпляра (который изменяет данные). Знак "+" сообщает компьютеру, что это класс (статический) метод.

Ответ 4

Вы сказали, что вы читаете "Программирование в Objective C 2.0" Стивена Кочана. Это может быть не так быстро, как хотелось бы, но некоторое время, проведенное с этой книгой, послужит вам хорошо. Все, что вы просите, адресовано в книге Кочана. Вы можете дополнить это тем, что найдете на сайте Apple, в Википедии и на O'Reilly MacDevCenter.com, например "Внутри Objective-C Runtime". Объективная C динамическая реализация объектов немного отличается от Java или С++ и имеет для нее другой взгляд, возможно, из-за подхода, основанного на Smalltalk. Пойдите с Kochan, добавьте это в сеть и посмотрите, были ли проверены ключевые точки прилипания. Если нет, это будет отличным местом для них.

Ответ 5

Я также начинаю работать с Objective C, и я согласен с синтаксисом, кажущимся иностранным относительно Java или С++. Лучшее, что я нашел, это просто прочитать код примера. Я уверен, что вы можете найти много с небольшим количеством поисковых запросов. Мне не разрешено размещать более одной ссылки, но если вы указали "объективный пример кода" Google, вы должны найти много кода.

Если вы просто ищете краткую ссылку на то, что некоторые из странных синтаксисов, это довольно хороший учебник:

http://cocoadevcentral.com/articles/000082.php

Ответ 6

Если все это вас просто сбивает, начните изучать Свифт! Все классные вещи, что obj-c, но с гораздо более узнаваемым синтаксисом. И они тоже считают, что это быстрее. Доступно, если у вас есть учетная запись apple dev - получите XCode 6/iOS8 beta.