2011-11-24 84 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