在iOS SDK中,可以找到Apple定义的许多常量,如下所示:
extern const CFStringRef kSomeReallyNiceConstant
__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_8_0);
如果我检查这种恒定标准方式的存在:
if (NULL == &kSomeReallyNiceConstant)
我几乎引用它并且为了使我的代码能够正确编译,在这种情况下我至少需要iOS SDK 8.0或更高版本。
对于对象和方法,反射方法可以很好地使用NSClassFromString
,respondsToSelector
和performSelector
。
是否有机会使用某种反射(通过名称访问字符串常量)来尝试获取它的值(如果它存在)(如果不存在则没有)?
我知道我可以使用宏来检查iOS版本并根据该信息执行不同的代码路径,但我不想使用这种方法。
我设法用指针执行此操作:
#include <dlfcn.h>
// ...
int *pointer = dlsym(RTLD_SELF, "kSomeReallyNiceConstant");
if (pointer) {
NSLog(@"Thing exists!");
} else {
NSLog(@"Nope, doesn't exist!");
}
但我不确定这是否会导致应用拒绝。你也许知道吗?
无论这种指针方法如何,我都很想知道是否有其他方法可以实现这一目标?
答案 0 :(得分:0)
没有比在此主题上找到的建议解决方案更好的了。
#include <dlfcn.h>
// ...
int *pointer = dlsym(RTLD_SELF, "kSomeReallyNiceConstant");
if (pointer) {
NSLog(@"Thing exists!");
} else {
NSLog(@"Nope, doesn't exist!");
}