2010-11-22 74 views
3

我在iPhone上使用Objective-C進行工作,需要知道'類'是否繼承自'NSObject'。如何判斷某個類是否繼承自NSObject(Objective-C)

我試圖檢查其是否響應一個NSObject的選擇:

bool success = [myClass respondsToSelector:@selector(class)]; 

,但你能猜到發生了什麼事......它甚至沒有迴應「respondsToSelector:」所以它拋出一個「未實現doesNotRecognizeSelector:「異常。

我試圖捕獲該異常,但它看起來不能用@ try- @ catch捕獲。

任何想法?

+2

我認爲更好的問題是,你如何來被處理這些類,不從NSObject繼承。除了議定書外,不應該有任何東西。 – Chuck 2010-11-22 23:33:16

+1

@Chuck和`NSProxy`。 – 2010-11-23 00:52:20

+0

你的意思是`@selector(class)`。我認爲SDK中沒有任何迴應`+ class:`的東西。 – 2010-11-23 03:00:25

回答

7

直接去找Objective-C運行:

#import <objc/runtime.h> 

/* originally posted version — works because eventually class_getSuperclass(class) 
returns nil, and class_getSuperclass(nil) does so also. */ 
BOOL classDescendsFromClass(Class classA, Class classB) 
{ 
    while(1) 
    { 
     if(classA == classB) return YES; 
     id superClass = class_getSuperclass(classA); 
     if(classA == superClass) return (superClass == classB); 
     classA = superClass; 
    } 
} 

/* shorter version; exits straight after classA turns into nil */ 
BOOL classDescendsFromClassShorter(Class classA, Class classB) 
{ 
    while(classA) 
    { 
     if(classA == classB) return YES; 
     classA = class_getSuperclass(classA); 
    } 

    return NO; 
} 
... 

if(classDescendsFromClass(classToTest->isa, [NSObject class]) ... 

class_getSuperclass做什麼它說,它的安全由Objective-C運行的指針,因爲只有元類的只有一個實例進行比較元類爲每個班級。 isa指針是絕對在struct objc_object中唯一的東西。

編輯:此外,有一些已知的錯誤在iPhone模擬器,導致一些異常不被try/catch塊捕獲。我已經將它們報告爲Apple的一個漏洞,並被告知我的版本是重複的,所以他們肯定知道。您是在真實設備上還是在模擬器中試用您的代碼?

EDIT2:在這次談話給其他地方更廣泛的背景下,這樣的事情可能是個聰明人:

#import <objc/runtime.h> 

BOOL classRespondsToSelector(Class classA, SEL selector) 
{ 
    return class_getInstanceMethod(classA, selector) ? YES : NO; 
} 

.... 
if(classRespondsToSelector(instance->isa, @selector(respondsToSelector:)) 
{ 
    // great, we've got something that responds to respondsToSelector:; do the 
    // rest of our querying through there 
} 
4

您可以使用方法isKindOfClass:isMemberOfClass:來確定某個類是否是另一個類的子類,或者它是否是特定的類。

1

respondsToSelector:本身就是一個NSObject定義的選擇器,所以你不能使用它。我不相信如果不深入Objective-C的內部,就有辦法做到這一點。

請問爲什麼你的對象不是NSObject的後代?蘋果非常強烈建議你不要嘗試創建它們,並且有充分的理由。

-3

類'Class'不從NSObject繼承。這意味着NSObject定義的方法(例如isKindOfClassrespondsToSelector)不能用於它。

你打算怎麼處理它呢?

相關問題