2011-11-24 85 views
3

我正在编写一个Objective-C游戏,我正处于应该开始优化游戏循环中某些代码的阶段。
我有一个广泛的类的量比较使用的方法,字符串比较与目标C中的类比较-C

如果([OBJ isMemberOfClass:[SomeClass的类])


听说这种检查是相当昂贵,因为我选择只有一个数组填充多个类,所以我需要某种类检查。
我在想也许是添加一个属性NSObject子类NSObject包含一个字符串属性,在初始化期间,我会使相当于该特定子类的类名称。然后,只需做一个

如果([obj.klass isEqualTo:@ “SomeClass的”])

这将是有益的?
我试图尽可能保持游戏循环中尽可能多的动态编码。

谢谢!

+1

我不知道为什么isMemberOfClass或isKindOfClass会特别昂贵。但是如果我打算在类中放入一个字段来区分它们,我会使用int/NSNumber字段,以便可以在switch语句中使用该值。 –

+0

类,有一个C,而不是K ...如果你想从对象的类中得到一个字符串,你需要使用'NSStringFromClass()'函数...... – Macmade

+1

你不能定义@property(assign)NSString *类。禁止使用'class'作为其保留标签。我问是否可以使用字符串比较的好处。 NSStringFromClass()方法将放置在init方法中,不会在迭代循环中调用。 – Ospho

回答

10

简答:没有。与其他比较(或分类,分类)对象的方法相比,字符串比较成本过高。

长答案:不要优化你没有分析,测量和比较的东西。在开始优化之前,您真正想要做的是明确了解您的应用程序的行为方式以及其性能瓶颈。您尝试进行的更改不会导致性能发生任何明显变化,因此我建议先找出真正的瓶颈。

在这种特殊情况下,如果测试失败,将isEqual发送到NSString比isMemberOfClass慢4倍。而这样的条件测试大多数时间都失败了,这就是为什么你应该忽略测试成功的结果。

成功的字符串比较是快速的,因为它是一个简单的指针比较,如果两个字符串相等,它们很可能指向相同的内存地址。如果它们不相等,则字符串中的每个字符将进行比较以获得相等性,可能是使用散列方法。

以下是我添加到我的performance test project中的对象比较测试的结果。您可以使用该项目进行进一步测试。

enter image description here

2

这是不是一个真正的直接回答你的问题,但在更广泛意义上的答案。

在Objective-C中,哲学更像是发送消息并让对象决定如何处理它的Smalltalk。如果你发现自己不得不做很多测试来查看对象是什么类,那么你需要重新考虑你的设计。

举例来说,如果你有对象的数组,你想每一个转换为整数做一些关于它的数学,你可以做这样的事情:

for (id anObj in array) 
{ 
    int anInt = [anObj intValue]; 
    // do something with anInt 
} 

没关系每个anObj是什么类别,你可以发送-intValue到它。例如,如果你的数组满了NSStringsNSNumbers,那没关系,上面的代码会做你所期望的。

许多类没有为选择器-intValue定义方法。例如,如果您将该消息发送给NSData的实例,它将通过抛出异常来进行响应。根据具体情况,有几种解决方法。

  1. 忽略不给选择通过测试对象响应,看看对象知道选择

    for (id anObj in array) 
    { 
        if ([anObject respondsToSelector: @selector(intValue)]) 
        { 
         int anInt = [anObj intValue]; 
         // do something with anInt 
        } 
    } 
    
  2. 你知道会被放在阵列中的所有类定义的选择。这是通过声明category完成的。这样你可以扩展任何Objective-C类而不需要子类化。例如,你可以为NSData定义一个intValue方法,该方法返回它的长度,或者它的字节总数或者其他合适的值。

  3. 通过声明protocol来使规范正式化。然后您可以测试协议的一致性,或者依靠编译时间检查来确保放入阵列的对象符合协议。

有很多事情你可以做,但是你需要从类层次结构的C++/Java模型中解脱出来。 Objective-C在这方面更加灵活。

+0

感谢您的洞察力,objective-C(简单C吧)实际上是我学过的第一门语言。 – Ospho