直接去找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
}
我認爲更好的問題是,你如何來被處理這些類,不從NSObject繼承。除了議定書外,不應該有任何東西。 – Chuck 2010-11-22 23:33:16
@Chuck和`NSProxy`。 – 2010-11-23 00:52:20
你的意思是`@selector(class)`。我認爲SDK中沒有任何迴應`+ class:`的東西。 – 2010-11-23 03:00:25