Почему гвоздь протокол NSObject к реализации протокола

Вам необходимо хранить файлы mule-project.xml, .classpath и .project в хранилище на тот случай, если вы не используете Maven.

Пожалуйста, проверьте / поделитесь файлом gitignore. Также проверьте Журнал ошибок , там должно быть описание того, чего не хватает.

31
задан Jonathan Sterling 15 April 2011 в 22:55
поделиться

5 ответов

Я вполне уверен причина, которую Вы сделали бы, это должно добавить, участники NSObject (скажите как, сохраняют и выпускают) к Вашему протоколу. Технически можно все еще отправить те сообщения так или иначе, но Вы получите предупреждение компилятора без него.

28
ответ дан Lounges 27 November 2019 в 21:41
поделиться

Когда Вы объявляете переменную как

 id<MyProtocol> var;

компилятор Objective C знает только о методах в MyProtocol и таким образом произведет предупреждение, при попытке назвать какой-либо из NSObject методы, такой как -retain/-release, на том экземпляре. Таким образом Какао определяет NSObject протокол, который зеркально отражает NSObject методы класса и методы экземпляра. Путем объявления этого MyProtocol реализации NSObject протокол, Вы даете компилятору подсказку что весь из NSObject методы будут реализованы экземпляром, который реализует MyProtocol.

Почему все это необходимо? Objective C позволяет объектам убывать от любого корневого класса. В Какао NSObject наиболее распространен, но не единственный корневой класс. NSProxy также корневой класс, например. Поэтому экземпляр типа id не обязательно наследовался NSObjectметоды.

31
ответ дан Barry Wark 27 November 2019 в 21:41
поделиться

Также очень удобно, когда у Вас есть протоколы, которые имеют @optional методы (например, "современный" Objective C, 2,0 делегата часто используют эту технику), Если Вы не включаете NSObject протокол, Вы получите предупреждения, когда Вы попытаетесь звонить respondsToSelector: на объекте.

22
ответ дан Alex 27 November 2019 в 21:41
поделиться

Я никогда не делал этого в своем коде, но я видел преимущество для него. Если Вы передаете параметр как id <SomeProtocol> необходимо будет переделать его, если Вы захотите назвать какой-либо из методов NSOBJECT на том объекте.

2
ответ дан Marc Charbonneau 27 November 2019 в 21:41
поделиться

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

2
ответ дан Ash 27 November 2019 в 21:41
поделиться