2014-02-10 5 views
1

У меня есть следующий метод. В настоящее время я использую блоки try/catch, чтобы определить, является ли аргумент классом или протоколом, и похоже, что он вызывает утечку памяти. Каков правильный способ определить, является ли классклассом или протоколом?Определить, является ли аргумент классом или протоколом

[self _injectMacro:[MyClass class]]; 
[self _injectMacro:@protocol(MyProtocol)]; 

+ (id)_injectMacro:(id)x 
{ 
    @try { 
     return NSStringFromProtocol(x); 
    } 
    @catch (NSException *exception) { 

    } 

    @try { 
     return NSStringFromClass(x); 
    } 
    @catch (NSException *exception) { 

    } 

    return nil; 
} 
+0

Ни документы метода, что происходит, если класс/протокол не существует. Даже если ваш код работает сегодня, это может быть не завтра. –

+0

Какао не является, в общем, исключением. Продолжение после лова может вызвать проблемы, такие как утечка памяти. С другой стороны, эти функции не выдают исключений, насколько я знаю. Действительно ли этот код делает то, что вы ожидаете? –

+0

@JoshCaswell Спасибо. Вы правы, мой код всегда проходил первую попытку, и это было действительно. Когда я переключил место двух попыток и попыток, он начал бросать EXC_Bad_Access, поэтому он не поймал исключение. – aryaxt

ответ

3

Вы можете использовать isKindOfClass найти или не id является протоколом:

id x = [NSObject class]; 
id y = @protocol(NSObject); 
NSLog(@"%d", [x isKindOfClass:[Protocol class]]); // 0 
NSLog(@"%d", [y isKindOfClass:[Protocol class]]); // 1 

Вы должны импортировать ObjectiveC.Protocol модуль использовать Protocol:

@import ObjectiveC.Protocol; 

или если вы не используют модули, просто импортируйте заголовок протокола:

#import <objc/Protocol.h> 

Чтобы проверить, если id класс или экземпляр имеет выглядеть this answer

+0

Получение ошибки компиляции для этого импорта. Неожиданный «@» в программе – aryaxt

+2

Это новый синтаксис модуля. Попробуйте '#import ', @aryaxt. –

+0

@JoshCaswell, похоже, не работает, это сработало для вас? – aryaxt

Смежные вопросы