0

这是对上一个问题的轻微跟进:

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

4

1 回答 1

2

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

于 2012-08-02T13:27:02.970 回答