2014-02-10 52 views
1

我有以下方法。我目前使用try/catch塊來確定參數是一個類還是一個協議,並且它好像會導致內存泄漏。什麼是確定x是類還是協議的正確方法?確定參數是類還是協議

[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謝謝。你是對的,我的代碼一直在經歷第一次嘗試,並且它是有效的。當我切換兩個try-and-catch的位置時,它開始拋出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