2016-06-20 7 views
0

Есть три вида реализации протокола:Разница между ID <protocol> SomeObject и NSObject <protocol> * SomeObject

Первое:

@protocol FirstProtocol 
... 
@end 

@property(nonatomic, weak) id<FirstProtocol> delegate; 

Второе:

@protocol SecondProtocol<NSObject> 
... 
@end 

@property(nonatomic, weak) id<FirstProtocol> delegate; 

Третий:

@protocol SecondProtocol 
... 
@end 

@property(nonatomic, weak) NSObject<FirstProtocol> *delegate; 

Я просто знаю "<NSObject> или NSObject<protocol>" может позволить делегат назвать селектор NSObject. Но я не знаю, в чем разница между ними. И какая из них - лучшая Практика.

ответ

1

Вы делаете заявления о том, какие методы можно назвать на delegate.

В id<FirstProtocol> единственными поддерживаемыми методами являются те, которые указаны в FirstProtocol.

В id<SecondProtocol> поддерживаемые методы указаны в SecondProtocol и NSObject protocol. Это дает вам доступ к -class, -superclass, -isEqual:, -hash, -self и всем остальным методам в протоколе NSObject.

В NSObject<FirstProtocol> объект должен быть видом NSObject. Он имеет доступ к -copy, -mutableCopy и всему остальному, что зависит от класса NSObject.