Хотите выучить Objective-C, но синтаксис очень запутанный - PullRequest
20 голосов
/ 10 июня 2010

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

Например:

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

Что это за тире и почему в скобках стоит пустота? Я никогда не видел пустоты в скобках в C / C ++, Java или C #. Почему у нас нет точки с запятой после (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: После прочтения всех этих ответов и немного дальнейшего программирования в Цели C 2.0, все это начинает обретать смысл!

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

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

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

myFraction = [[Fraction alloc] init]; 

Ответы [ 6 ]

29 голосов
/ 10 июня 2010

Для чего нужен этот штрих и почему в скобках стоит 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 конструктор класса (кстати, Руби делает то же самое за кадром )

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

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

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

 @implementation Fraction

 @end

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

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

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

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

6 голосов
/ 10 июня 2010

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

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

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

Это похоже на C ++ с небольшим количеством синтаксиса на его лице.

Для чего нужен этот штрих и почему в скобках стоит void?

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

Я никогда не видел пустоты в скобках в C / C ++, Java или C #.

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

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

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

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

@implementation Fraction

@end

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

public class Fraction {

}
2 голосов
/ 10 июня 2010

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

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

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

2 голосов
/ 10 июня 2010

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

2 голосов
/ 10 июня 2010

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

0 голосов
/ 14 августа 2014

Если все, что вас только что сломало, начните изучать Swift! Делает все классные вещи, которые делает obj-c, но с гораздо более узнаваемым синтаксисом. И они считают это быстрее. Доступно, если у вас есть аккаунт Apple Dev - получите бета-версию XCode 6 / iOS8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...