这是上一个问题的后续内容:
for(id <stuffieProtocol> eachObject in stuffieArray) {
if([eachObject respondsToSelector:@selector(secretID)]) [eachObject secretID];
}
以上是来自快速枚举循环的一行,该循环从NSArray
中取出许多对象,并检查它们是否响应方法secretID
。方法secretID
不是@protocol
的一部分,而是在集合中的一个对象上定义的方法。
上面的if
语句失败了,因为编译器说"No known instance method for selector secretID"
哪个好,id不关心,而且<stuffieProtocol>
中没有定义方法我可以通过将每个对象强制转换为定义secretID:
if([eachObject respondsToSelector:@selector(secretID)]) [(Ted *)eachObject secretID];
我的问题在原始代码中,编译器如何知道eachObject
响应方法secretID
但是当你要求它调用该方法时它说“没有已知方法”我是对机制有点好奇吗?
答案 0 :(得分:2)
编译器不知道对象是否响应该选择器而运行时是否响应。 (即编译器不执行代码。)编译器只关心任何NSObject可以响应respondsToSelector:
。