如何处理NSSet或NSArray的枚举?

时间:2014-03-20 02:38:10

标签: objective-c

当我枚举NSSetNSArray名为array时,我希望其中包含MyObject类型的对象:

for(MyObject *eachObject in array) {
    [eachObject methodOnMyObject];
}

看来我需要执行类内省,以确保每次枚举时都有预期的对象(或者输出格式错误导致崩溃的风险):

for(MyObject *eachObject in array) {
    if(eachObject isKindOfClass:[MyObject class]) {
        [eachObject methodOnMyObject];
    }
}

或者协议:

for(id<MyProtocol> *eachObject in array) {
    if(eachObject conformsToProtocol:@protocol(MyProtocol)) {
        [eachObject methodOnMyProtocol];
    }
}

有没有更好的方法来处理此类案件?在我的每个循环中检查类类型似乎很慢。

输入格式错误的情况是否应该尝试处理,而是抛出异常?

1 个答案:

答案 0 :(得分:0)

也许已经太晚了,并没有完全满足作为答案,但如果你的程序处于这样一个动态环境中,你不确定NSSet或NSArray中有哪些对象,我会使用“respondToSelector”方法而不是你刚刚提出的两个。但是,如果您不确定集合中的对象是什么,则需要进行内省。所以没有比这更好的方法了。

为什么“respondToSelector”而不是你正在使用的?根据您的示例代码,您只需要检查数组或集合中的下一个对象是否响应您的方法,而不是在方法调用期间返回异常。然后在您的方法中,您可以检查结果是否不是假的,只是延迟了异常。我猜,这些检查已经在您的方法中了。

对象是否响应选择器通常位于对象的缓存中,因此不会造成性能损失。 Apple指南还建议比较对象的哈希,这更简单。我对后者没有经验,但“respondToSelector”从来没有给我带来巨大的性能问题。然后我的阵列从来没有特别大。