【发布时间】:2014-03-07 04:39:39
【问题描述】:
我有以下方法。我目前使用 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;
}
【问题讨论】:
-
这两种方法都没有记录如果类/协议不存在会发生什么。即使您的代码今天可以工作,但明天可能就不行了。
-
Cocoa 通常不是异常安全的。捕获后继续可能会导致问题——例如内存泄漏。另一方面,据我所知,这些函数不会引发异常。这段代码真的符合你的预期吗?
-
@JoshCaswell 谢谢。你是对的,我的代码总是通过第一次尝试,它是有效的。当我切换两个 try-and-catch 的位置时,它开始抛出 EXC_Bad_Access,所以它并没有真正捕捉到异常
-
如果这些函数不直接调用适当的运行时函数
class_getName()和protocol_getName(),我会感到惊讶,这两个函数都试图取消引用它们的参数,例如@987654325 @
标签: objective-c class protocols