2008-12-10 28 views
3

假設我在objective-c中有一個通用指針。該指針可以是Class對象,也可以是該類的實例。有什麼辦法可以說明兩者之間的區別嗎?在objective-c中,我該如何區分類和類的實例?

例子:


id pointerA = [someClass class]; 
id pointerB = [[someClass alloc] init]; 

bool pointerAIsAClass = is_this_a_Class(pointerA); // should be true 
bool pointerBIsAClass = is_this_a_Class(pointerB); // should be false 

我怎麼會寫is_this_a_Class功能,使其返回正確bool價值?

bool is_this_a_Class(id somePointer) 
{ 
    // your code goes here 
}

回答

3

最正確的方法是檢查類的對象,看看它是否是一個元類:

BOOL object_isClass(id object) { 
    return class_isMetaClass(object_getClass(object)); 
} 

有更多的答案在這裏:Check if object is Class type

4

我沒有看到一個更好的辦法,這是不是萬無一失的,但這應該工作:

BOOL pointer_isClass(id object) { 
    return [object respondsToSelector:@selector(instancesRespondToSelector:)]; 
} 

因爲,從理論上講,只有Class對象將在-instancesRespondToSelector:消息這應該響應工作。除了實際的objc_*調用之外,雖然我沒有看到任何真正的API。

UPDATE:
閱讀蛟的回答另一個想法來找我後,測試指針的到-class方法響應。在類對象上調用-class應等同於在對象實例上調用-self,但會返回對象實例上的另一個對象。

BOOL pointer_isClass(id object) { 
    return object == [object class]; 
} 

我想這應該是更萬無一失,尤其是在情況下一個對象實例實現-instancesRespondToSelector:這個應該工作時間的100%。

+0

是的,這工作。謝謝! – 2008-12-10 08:24:45

+0

美麗。你的新方法有效並且更加優雅。再次感謝:) – 2008-12-10 18:16:40

相關問題