回应,但不知道?

时间:2012-08-02 13:23:31

标签: iphone objective-c cocoa-touch

这是上一个问题的后续内容:

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但是当你要求它调用该方法时它说“没有已知方法”我是对机制有点好奇吗?

1 个答案:

答案 0 :(得分:2)

编译器不知道对象是否响应该选择器而运行时是否响应。 (即编译器不执行代码。)编译器只关心任何NSObject可以响应respondsToSelector: