- (void)foo {
id objc = nil;
[objc respondsToSelector:@selector(foo)]; // Works fine
}
和
@protocol DummyProtocol
@end
//...
- (void)foo {
id<DummyProtocol> objc = nil;
[objc respondsToSelector:@selector(foo)]; //Error: No known instance method for selector 'respondsToSelector'
}
我知道在这种情况下DummyProtocol不会从NSObject继承,因此会发生错误。但第一种情况有点棘手,id本质上是一个指向objc_object结构的C结构指针。它不应该假设有任何ObjC方法实现......
在这两种情况下,点语法都会产生错误,例如
- (void)foo {
id obj = nil;
obj.description; //Error: Property 'description' not found on object of type '__strong id
id<DummyProtocol> objc = nil;
objc.description; //Error: Property 'description' not found on object of type '__strong id<DummyProtocol>'
}
我检查Clang documentations并没有运气。这已经在我脑海中大约2天了,任何建议都会有所帮助......
答案 0 :(得分:0)
id
的[]
将在编译时接受来自项目的任何类/协议的任何选择器id<DummyProtocol>
仅接受DummyProtocol中的选择器.
语法将仅接受来自特定具体类/协议的选择器(因此,它永远不会单独与id
一起使用)请注意,description
不是您的DummyProtocol的一部分。