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>
中,支持的方法是在SecondProtocol
和NSObject
protocol中指定的方法。这使您可以访问 -class
、-superclass
、-isEqual:
、-hash
、-self
以及 NSObject
协议中的所有其他方法。
在NSObject<FirstProtocol>
中,对象必须是NSObject
的一种。它可以访问 -copy
、-mutableCopy
以及依赖于 NSObject
class.
的所有其他内容
协议实现分为三种:
第一个:
@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>
中,支持的方法是在SecondProtocol
和NSObject
protocol中指定的方法。这使您可以访问 -class
、-superclass
、-isEqual:
、-hash
、-self
以及 NSObject
协议中的所有其他方法。
在NSObject<FirstProtocol>
中,对象必须是NSObject
的一种。它可以访问 -copy
、-mutableCopy
以及依赖于 NSObject
class.