2014-08-29 46 views
1

我有類tructure這樣如何檢查類級方法是否在超類或Objective C中的子類中?

@interface SuperClass: NSObject 
+ (void) someName; 
@end 


@interface MyClass: SuperClass 

@end 

有,我只想要撥打的someName如果是MyClass沒有MyClass的超類方法的情況下。由於[[MyClass class] respondsToSelector:@selector(someName)]如果一個類或它對選擇器的超級響應返回YES。如何知道MyClass不包含包含someName

在我的應用程序中,我想打印包含從類方法返回的字符串鏈的字符串。

採取abve類結構作爲一個例子,我想打印的東西,如:

somenameFromSuper.somenameFromClass.someNameFromeSubClass. 

如果一個類不列入實施someName方法,我想'不可用的來取代它,爲前:

somenameFromSuper.notavailable.someNameFromeSubClass. 
+0

我不明白你的問題。你不是隻需要否定測試? – trojanfoe 2014-08-29 07:15:00

+0

我更新了這個問題,希望它有道理 – jAckOdE 2014-08-29 07:19:00

+0

爲什麼你不檢查'self'是否是'MyClass',即if([[self class] isKindOfClass:[MyClass class]])thats thats that I also also understand the問題正確。 – sbarow 2014-08-29 07:21:07

回答

4
_Bool class_implementsMethodForSelector(Class cls, SEL selector) 
{ 

    unsigned methodsCount; 
    Method* methods = class_copyMethodList(cls, &methodsCount); 
    for (unsigned methodIndex=0; methodIndex<methodsCount; methodIndex++) 
    { 
     if (method_getName(methods[methodIndex]) == selector) 
     { 
      break; 
     } 
    } 

    free(methods); 
    return methodsIndex<methodsCount; 
} 

… 

Class classToTest = …; 
classToTest = object_getClass(classToTest); // For checking class methods 
if (class_implementsMethodForSelector(classToTest, @selector(someName)) 
{ 
    … 
} 
else 
{ 
    … 
} 

鍵入Safari。

編輯:做了它的功能。仍然在Safari中輸入。

+0

實例方法怎麼樣?它適用於實例方法嗎? – jAckOdE 2014-08-29 09:40:48

+0

只需省略'classToTest = object_getClass(classToTest);'。長話短說:你問班的實例方法。爲了得到類示例中的類方法,可以詢問「類」類(metaclass)。這是聲明。 – 2014-08-29 09:42:16

+0

你有內存泄漏。不要忘記打電話免費(方法); – KirkSpaziani 2014-11-25 21:19:13

相關問題