這是不是一個真正的直接回答你的問題,但在更廣泛意義上的答案。
在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