为什么 ObjC 的 protocol 都要遵从 NSObject 协议?
2016-10-09 13:08
281 查看
今天在改代码的时候看到定义的 delegate 里面都写了 <NSObject> 在后面:
由于太久没写 ObjC 了,顺手就给去掉了。回头人告诉我这东西编译时会报 warning。我就觉得奇怪了,其实基本上常用的类都是以 NSObject 为基类的,除非是为了周密考虑,把以 NSProxy 为基类的类给排除掉,否则干嘛非得加个 <NSObject> 协议不可。问了人然后自己也试了一下,发现是在这里 warning:
respondsToSelector 这个方法找不到。明白了,遵循 <NSObject> 是为了确保实现了这个方法,这样在调用的时候就可以直接用这个方法检测是否能响应这个 SEL 了。
其实在 ObjC 1.0 的时候,protocol 的这个 @optional 选项是不存在的,所有的 protocol 方法都是必须实现的。所以不遵循 <NSObject> 也没关系,只要判断指针是否存在然后直接调用就完了。但是 ObjC 2.0 加入了 @optional 特性,于是乎必须使用 的 respondsToSelector: 方法先做一次判断了。
源URL:https://justinyan.me/post/1640
@protocol APerfectDelegate <NSObject> @optional - (void)optionalSel; @required - (void)requriedSel; @end
由于太久没写 ObjC 了,顺手就给去掉了。回头人告诉我这东西编译时会报 warning。我就觉得奇怪了,其实基本上常用的类都是以 NSObject 为基类的,除非是为了周密考虑,把以 NSProxy 为基类的类给排除掉,否则干嘛非得加个 <NSObject> 协议不可。问了人然后自己也试了一下,发现是在这里 warning:
// Instance method 'respondsToSelector:' not found if ( _delegate != nil && [_delegate respondsToSelector:@selector(optionalSel)] ) { [_delegate optionalSel]; }
respondsToSelector 这个方法找不到。明白了,遵循 <NSObject> 是为了确保实现了这个方法,这样在调用的时候就可以直接用这个方法检测是否能响应这个 SEL 了。
其实在 ObjC 1.0 的时候,protocol 的这个 @optional 选项是不存在的,所有的 protocol 方法都是必须实现的。所以不遵循 <NSObject> 也没关系,只要判断指针是否存在然后直接调用就完了。但是 ObjC 2.0 加入了 @optional 特性,于是乎必须使用 的 respondsToSelector: 方法先做一次判断了。
源URL:https://justinyan.me/post/1640
相关文章推荐
- NSObject class和NSObject protocol的关系(抽象基类与协议)
- 第七讲:Obj-C 协议 Protocol
- 第七讲:Obj-C 协议 Protocol
- NSObject class和NSObject protocol的关系(抽象基类与协议)
- NSObject:类与协议(NSObject: the Class and the Protocol)
- Swift_协议、代理(protocol、delegate可选@objc optional与必需、协议扩展、is as? as!检查协议)
- YARN ApplicationMaster与ResourceManager之间基于applicationmaster_protocol.proto协议的allocate()接口源码解析
- ORA-12560: TNS:protocol adapter error(TNS:协议适配器错误)
- UDP可靠传输协议UDX,为什么在高延迟,丢包率较高的环境下,不受延迟及丢包影响原理讨论及深思
- ICMP(网络控制信息协议 internet control message protocol)
- TCP-IP详解卷1-16:BOOTP(Bootstrap Protocol):引导程序协议
- 通信协议之Protocol buffer(Java篇)
- object-c-协议-protocol
- OC中protocol协议
- 为什么要在预编译头中加__OBJC__?
- 协议protocol和代理模式基础内容总结和举例
- CDP:思科发现协议(CDP:Cisco Discovery Protocol)
- Objective-C( protocol协议)
- 为什么需要通信协议
- [笔记]NFC笔记——NFCIP-1协议命令集(NFCIP-1 Protocol Command Set)