id<protocol> someObject 和 NSObject<protocol> *someObject 的区别

The difference between id<protocol> someObject and 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> or NSObject<protocol>”可以让delegate调用NSObject选择器。 但我不知道它们之间有什么区别。哪个是最佳实践。

您正在声明可以在 delegate 上调用哪些方法。

id<FirstProtocol> 中,唯一支持的方法是 FirstProtocol 中指定的方法。

id<SecondProtocol>中,支持的方法是在SecondProtocolNSObject protocol中指定的方法。这使您可以访问 -class-superclass-isEqual:-hash-self 以及 NSObject 协议中的所有其他方法。

NSObject<FirstProtocol>中,对象必须是NSObject的一种。它可以访问 -copy-mutableCopy 以及依赖于 NSObject class.

的所有其他内容