这是对上一个问题的轻微跟进:
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
,但是当您要求它调用该方法时,它说“没有已知方法”我只是对机制有点好奇?