2013-03-30 2 views
1

Я определил протокол для своего пользовательского класса, и теперь я хочу дать ему делегат. Класс не будет создан, используется только для его методов класса. Класс делегата, однако, был создан и назначен константе. Если бы я был инстанцированием класса, я позволил бы отнести его к его делегату, как это:Как назначить делегат для класса (а не экземпляра), учитывая, что я не могу использовать свойства?

@property (weak) MyDelegateClass <MyProtocol> *delegate; 

Но поскольку я не инстанцирование класса, я не могу дать ему свойство. Итак, как я могу обратиться к его делегату? Метод геттера? Что-то вроде этого? Нужно ли мне также определять сеттер?

+ (<MyProtocol>MyDelegateClass *)delegate; 

Какой синтаксис здесь?

+2

Объявите статическую переменную и сконструируйте геттер и сеттер для него. AFAIK нет такой вещи, как свойство класса. Свойства всегда связаны с переменными экземпляра. –

+0

@ HermannKlecker положил это в ответе с примером, и я дам вам зеленый чек, если вы хотите – zakdances

+0

То, что я не понимаю. ... зачем ты делаешь это? В чем заключается цель получения протокола абстрактного класса, который никогда не был самоуничтожен? –

ответ

0
@interface NeverInstanciatedClass 

+ (MyDelegateClass *) delegate; 
+ setDelegate: (MyDelegateClass* <MyProtocol>) delegate; 

@end 

@implementation 

static MyDelegateClass <MyProtocol> *_delegate; 

+ (MyDelegateClass *) delegate { 
    return _delegate; 
} 

+ setDelegate: (MyDelegateClass* <MyProtocol>) delegate { 
    _delegate = delegate; 
} 

@end 

(с нуля - никогда не скомпилированного ни синтаксис проверяемого)

Если вы не ARC, то вы можете добавить некоторое управление памятью. Но, как вы используете (weak), я предполагаю, что вы используете ARC.

Если вы используете протоколы вообще, вам не нужно полностью квалифицировать MyDelegateClass* <MyProtocol>. id <MyProtoco> должен делать. Я просто сделал это, потому что ты сделал это в своих sniplets. Как вы получаете доступ к методам (и вы должны только обращаться к методам), которые объявлены в протоколе, нет необходимости даже знать, какой тип объекта он есть. Все, что вы (и компилятор) должны знать, это то, что он реализует протокол.

+0

Это работает, но XCode автоматически заполняет действительно не нравится. Он не хочет предлагать «NeverInstanciatedClass.delegate», даже если он действителен. – zakdances

+0

Я рад, что он работает. Выполняет ли xcode автозаполнение '[Девять делегатов NeverInstanciatedClass]; и '[NeverInstanciatedClass setDelegate: someObject]; '? –

+0

Да. Но не точечная нотация. :( – zakdances

Смежные вопросы