确定参数是类还是协议

时间:2014-02-10 00:35:10

标签: objective-c class protocols

我有以下方法。我目前使用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;
}

1 个答案:

答案 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