Разъяснение Objective-C; - / + и * вар - PullRequest
5 голосов
/ 02 января 2009

Я учу себя Objective-C из книги ( Программирование какао для Mac OS X ), и я на полпути, однако у меня есть два вопроса, на которые нет ответа или которые не определены в книге.

  1. При определении методов класса, в чем разница (при условии, что в файле .h):

    - (int) население;

    + (int) население;

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

// Using -
Earth *world = [[Earth alloc] init];
int population = [world population];

// Using +
int population = [Earth population];

Если это так, то когда мне следует использовать статические методы и есть ли у них какие-либо недостатки при этом.

  1. При определении переменной в параметре функции или в качестве фактической переменной в функции означает ли использование *, что переменная будет объектом? например (снова в заголовочном файле.)

    - (void) setPopulation: (NSNumber *) население; // Использование * в качестве совокупности NSNumber

    - (void) setPopulation: (int) население; // население не класс, поэтому не нужно *

Извините, если какой-либо из моих терминов не имеет смысла в области Objective-C, такой как статические методы и т. Д. Я программист на PHP и Ruby.

Ответы [ 3 ]

21 голосов
/ 02 января 2009

- / + в объявлениях метода для Objective-C просто обозначает, является ли метод методом класса или методом экземпляра. Например, в Objective-C вы не можете отправить экземпляру сообщение, которое было объявлено как метод класса. Например:

@interface MyObject : NSObject
-(void)myInstanceMethod;
+(void)myClassMethod;
@end

// ...

MyObject* obj = [[MyObject alloc] init];

[obj myInstanceMethod];      // this is okay
[obj myClassMethod];         // this will fail
[[obj class] myClassMethod]; // this is okay
[MyObject myClassMethod];    // this is okay
[MyObject myInstanceMethod]; // this will fail

Что касается второй части вашего вопроса, Objective-C является строгим супернабором C. Он добавляет классы, но на самом деле это структуры данных C, реализации которых скрыты от вас во время выполнения Objective-C. Из-за этого классы всегда представлены в виде указателей. В C * означает, что переменная объявляется как указатель на некоторый адрес памяти. Вы также можете использовать указатели с примитивными типами в C, но объекты Objective-C всегда должны указываться указателями.

Есть много отличных обучающих программ / введений в указатели. Я бы предложил просто поискать учебник по C и указатели, чтобы узнать больше.

0 голосов
/ 02 января 2009

Объявление + - это метод класса, вам не нужен экземпляр для его вызова. Конструкторы / фабричные методы должны быть методами класса. - объявлен метод экземпляра, операция над одним экземпляром. Каждый экземпляр имеет свое независимое состояние (переменные-члены). Это принципиальная разница в ОО программировании! В общем случае делают большинство методов экземплярами методов, за исключением служебных классов.

0 голосов
/ 02 января 2009

Вы можете увидеть обсуждение того, когда использовать статические методы, в Когда мне писать статические методы?

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