Clang不会抱怨[id respondsToSelector:@selector(foo)];

时间:2018-03-25 17:16:17

标签: static clang

- (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天了,任何建议都会有所帮助......

1 个答案:

答案 0 :(得分:0)

    语法为id
  • []将在编译时接受来自项目的任何类/协议的任何选择器
  • id<DummyProtocol>仅接受DummyProtocol中的选择器
  • .语法将仅接受来自特定具体类/协议的选择器(因此,它永远不会单独与id一起使用)

请注意,description不是您的DummyProtocol的一部分。