ID и использование делегата в Obj-C - PullRequest
6 голосов
/ 26 декабря 2010

Мне интересно, что делает следующая строка кода:

@property (assign, nonatomic) id <CoursePlannerDelegate> delegate;

А именно, я задаюсь вопросом об этой части строки:

id <CoursePlannerDelegate> delegate;

Она также отображается в другихмест:

@interface CategoryAddViewController : UIViewController {

 UITextField *nameField, *weightField;
 double maxWeight; //The maximum weight that can be allocated to this Category (max value of 100)
 id <CategoryAddDelegate> delegate; //A Course Planner TVC

}

Ответы [ 2 ]

12 голосов
/ 26 декабря 2010

Ответ JustSid точен, но немного более ясен:

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

Тип данных id является анонимным объектом. Это объект Objective-C - это наверняка для компилятора. Компилятор знает, сколько места нужно зарезервировать для указателя на объект, но он не знает во время компиляции, является ли он NSString, UIViewController или чем.

Таким образом, когда вы используете тип id, вы можете указать (в угловых скобках) протокол, которого должен придерживаться этот анонимный объект.

В приведенном выше коде при компиляции компилятор проверит любой объект, который вы указали для делегата CategoryAddViewController, и дважды проверьте, что вы реализовали все необходимые методы, определенные в протоколе.

Подводя итог, использование угловых скобок при использовании типа id поможет компилятору сообщать вам, когда вы делаете что-то глупое.

Все это для времени компиляции - если вам нужно быть на 100% параноиком и во время выполнения, вы можете использовать conformsToProtocol:@protocol(foo) для проверки на соответствие (я считаю, что это метод для любого объекта NSObject).

4 голосов
/ 26 декабря 2010

Это гарантирует, что вы передаете объект Objective C, который соответствует данному протоколу.Вот если это не так, компилятор выдаст предупреждение, но не более того.

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