путаница с некоторыми протоколами Objective-C

Я загрузил исходный код приложения под названием adium, потому что я хотел лучше изучить какао, изучая чужой код, но в этом интерфейсе есть что-то очень запутанное для меня:

@interface AIAdium : NSObject <AIAdium, SUVersionComparison> {
@private
IBOutlet    NSObject <AIMenuController>         *menuController;
IBOutlet    NSObject <AIInterfaceController>        *interfaceController;
IBOutlet    SUUpdater                                   *updater;

NSObject <AIAccountController>                  *accountController;
NSObject <AIChatController>                     *chatController;
NSObject <AIContactController>                  *contactController;
NSObject <AIContentController>                  *contentController;...

Так и продолжается. Я не понимаю, как NSObjects соответствуют протоколам, таким как AIAccountController. Я думал, что вам нужно реализовать методы, определенные в интерфейсе протокола, чтобы соответствовать ему, но как NSObject мог это сделать?


person user3251270    schedule 13.06.2014    source источник


Ответы (1)


Эти строки означают не это. Пример:

NSObject <AIAccountController> *accountController;

Это означает, что accountController ivar является указателем на любой производный класс NSObject, который также соответствует протоколу AIAccountController.

Поскольку NSObject является корневым классом большинства других классов, это в основном означает, что любой настраиваемый класс, соответствующий протоколу, может быть назначен ivar.

Ничто в этой линии не имеет никакого отношения к самому NSObject.

Автор этого кода должен был использовать следующее:

id<AIAccountController> accountController;
person rmaddy    schedule 13.06.2014
comment
Скорее всего, автор использовал NSObject для сохранения, освобождения или RespondsToSelector :. Но в этом случае вы можете просто соответствовать протоколу NSObject. - person Chuck; 13.06.2014
comment
@Chuck Вы можете добиться этого (и я часто вижу этот шаблон), если ваш собственный протокол (в данном случае AIAccountController) «наследует» от NSObject, например: @protocol AIAccountController <NSObject>. - person Nicolas Miari; 13.06.2014
comment
Спасибо за это. Я понятия не имел, что ивары могут быть написаны так. - person user3251270; 13.06.2014
comment
@NicolasMiari Вот что я делаю. Все мои протоколы расширяют протокол NSObject. - person rmaddy; 13.06.2014