2010-06-26 36 views
20

例如,对于一个NSDictionary Cocoa框架中的访问变量通常会定义键,例如UIKeyboardBoundsUserInfoKey。如何检查运行时是否定义了密钥?我找到了关于如何检查类和函数的例子,但不是常量。检查是否在运行时定义了常量Obj-C

回答

45

Jasarien的回答大致是正确的,但很容易出现LLVM 1.5下的问题编译器将优化if语句了。

您还应该比较常数的地址为NULL,而不是nilnil有不同的语义)。

一个更准确的解决方案是这样的:

BOOL isKeyboardBoundsKeyAvailable = (&UIKeyboardBoundsUserInfoKey != NULL); 
if (isKeyboardBoundsKeyAvailable) { 
    // UIKeyboardBoundsUserInfoKey defined 
} 
+0

为什么不使用'#ifdef'? – 2014-10-29 11:56:47

+1

@lulian #ifdef使用#define'd宏https://gcc.gnu.org/onlinedocs/cpp/Ifdef.html除OP之外请求运行时检查,#ifdef不会这样做。 – Emanuel 2015-03-10 18:51:16

29

检查它的反对零指针,这样

if (&UIKeyboardBoundsUserInfoKey != nil) 
{ 
    //Key exists 
} 
+0

感谢,工程巨大。 – 2010-06-26 00:15:14

+3

我已经添加了一个可能有兴趣的更正的答案。 – 2011-03-11 03:08:12

+1

为什么不只是'if(&UIKeyboardBoundsUserInfoKey){}'? – 2016-01-18 13:54:12