这是不是一个真正的直接回答你的问题,但在更广泛意义上的答案。
在Objective-C中,哲学更像是发送消息并让对象决定如何处理它的Smalltalk。如果你发现自己不得不做很多测试来查看对象是什么类,那么你需要重新考虑你的设计。
举例来说,如果你有对象的数组,你想每一个转换为整数做一些关于它的数学,你可以做这样的事情:
for (id anObj in array)
{
int anInt = [anObj intValue];
// do something with anInt
}
没关系每个anObj
是什么类别,你可以发送-intValue
到它。例如,如果你的数组满了NSStrings
和NSNumbers
,那没关系,上面的代码会做你所期望的。
许多类没有为选择器-intValue
定义方法。例如,如果您将该消息发送给NSData
的实例,它将通过抛出异常来进行响应。根据具体情况,有几种解决方法。
忽略不给选择通过测试对象响应,看看对象知道选择
for (id anObj in array)
{
if ([anObject respondsToSelector: @selector(intValue)])
{
int anInt = [anObj intValue];
// do something with anInt
}
}
你知道会被放在阵列中的所有类定义的选择。这是通过声明category完成的。这样你可以扩展任何Objective-C类而不需要子类化。例如,你可以为NSData定义一个intValue方法,该方法返回它的长度,或者它的字节总数或者其他合适的值。
通过声明protocol来使规范正式化。然后您可以测试协议的一致性,或者依靠编译时间检查来确保放入阵列的对象符合协议。
有很多事情你可以做,但是你需要从类层次结构的C++/Java模型中解脱出来。 Objective-C在这方面更加灵活。
我不知道为什么isMemberOfClass或isKindOfClass会特别昂贵。但是如果我打算在类中放入一个字段来区分它们,我会使用int/NSNumber字段,以便可以在switch语句中使用该值。 –
类,有一个C,而不是K ...如果你想从对象的类中得到一个字符串,你需要使用'NSStringFromClass()'函数...... – Macmade
你不能定义@property(assign)NSString *类。禁止使用'class'作为其保留标签。我问是否可以使用字符串比较的好处。 NSStringFromClass()方法将放置在init方法中,不会在迭代循环中调用。 – Ospho