我有以下方法。我目前使用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 :(得分: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