объркване с някои objektiv-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