Objective c 确定参数是类还是协议

Objective c 确定参数是类还是协议,objective-c,class,protocols,Objective C,Class,Protocols,我有以下方法。我目前使用try/catch块来确定参数是类还是协议,这似乎导致了内存泄漏。确定x是类还是协议的正确方法是什么 [self _injectMacro:[MyClass class]]; [self _injectMacro:@protocol(MyProtocol)]; + (id)_injectMacro:(id)x { @try { return NSStringFromProtocol(x); } @catch (NSExceptio

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

您可以使用
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
模块才能使用
协议

@import ObjectiveC.Protocol;
或者,如果您没有使用模块,只需导入协议头:

#import <objc/Protocol.h>
#导入

要检查
id
是否是类或实例,请查看如果类/协议不存在,两种方法都不会记录发生的情况。即使你的代码今天可以工作,明天也可能不行。一般来说,Cocoa不是异常安全的。捕获后继续可能会导致问题,例如内存泄漏。另一方面,据我所知,这些函数不会抛出异常。这段代码真的达到了你的预期吗?@JoshCaswell,谢谢。你是对的,我的代码总是经过第一次尝试,它是有效的。当我切换两个try-and-catch的位置时,它开始抛出EXC\u Bad\u访问,因此它没有真正捕获异常。如果这些函数没有直接调用相应的运行时函数,
class\u getName()
protocol\u getName()
,它们都试图取消引用它们的参数,我会感到惊讶,例如,
returnproto->name获取该导入的编译错误。程序中出现意外“@”,这是新的模块语法。请尝试
#导入
,@aryaxt.@JoshCaswell似乎不起作用,它对您起作用了吗?@JoshCaswell谢谢,我必须在生成设置中将“启用模块”设置为“是”。这意味着任何需要使用代码的项目都必须这样做。我想知道是否还有别的办法。我现在就用它。再次感谢您的快速回复answers@aryaxt:正如Josh指出的,您可以使用旧的
#import
语法。我已经更新了我的答案。