2015-02-12 61 views
2

說我有一個方法:如何檢查一個id是一個實例還是一個類?

- (void)method:(id)anObject 
{ 
    // do something 
} 

正如我們都知道的Objective-C類或對象了。所以我一直想知道如何確定id是否在方法內傳遞了一個類或CLASS本身的INSTANCE?

[object method:[NSObject new]]; 

或:

[object method:[NSObject class]]; 

我怎麼能找到傳遞的參數是一個實例,因爲它可以像使用它?我不能僅僅通過發送class消息檢查,因爲一類將返回相同的結果作爲一個實例

EDITED

由亞歷山大提供的方法不適合我,因爲我不知道是什麼課程將通過,所以我無法檢查某個班級的成員資格。我只需要知道它是否是一個類(不管是什麼類)或是一個實例(不管是什麼類)

回答

4

類從class消息返回self消息,實例返回它們的類。所以只是測試,如果從class結果是相同的接收器:

- (void)method:(id)anObject 
{ 
    if (anObject == [anObject class]) { 
     // it's a class 
    } else { 
     // it's an instance 
    } 
} 

編輯:雖然簡單,有兩個細微的問題,上面的代碼:

  1. 接收器必須實現class 。所有NSObject(和NSProxy)派生類都這樣做,但對於自定義根類,可能不是這種情況。非常罕見。

  2. 如果一個類不是返回self代碼會中斷。對於正在觀察的對象類(KVO),可能會出現這種情況。並不那麼難得。

這裏的代碼,會一直工作,不受這些問題:

#import <objc/runtime.h> 

- (void)method:(id)anObject 
{ 
    if (class_isMetaClass(object_getClass(obj))) { 
     // it's a class 
    } else { 
     // it's an instance 
    } 
} 
+0

正是我需要的 – 2015-02-12 09:21:44

+0

輝煌的解決方案! – Astoria 2015-02-23 13:51:48

相關問題