通过名称访问iOS SDK常量(反射)

时间:2017-05-26 19:00:26

标签: ios reflection const

在iOS SDK中,可以找到Apple定义的许多常量,如下所示:

extern const CFStringRef kSomeReallyNiceConstant
    __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_8_0);

如果我检查这种恒定标准方式的存在:

if (NULL == &kSomeReallyNiceConstant)

我几乎引用它并且为了使我的代码能够正确编译,在这种情况下我至少需要iOS SDK 8.0或更高版本。

对于对象和方法,反射方法可以很好地使用NSClassFromStringrespondsToSelectorperformSelector

是否有机会使用某种反射(通过名称访问字符串常量)来尝试获取它的值(如果它存在)(如果不存在则没有)?

我知道我可以使用宏来检查iOS版本并根据该信息执行不同的代码路径,但我不想使用这种方法。

我设法用指针执行此操作:

#include <dlfcn.h>

// ...

int *pointer = dlsym(RTLD_SELF, "kSomeReallyNiceConstant");

if (pointer) {
    NSLog(@"Thing exists!");
} else {
    NSLog(@"Nope, doesn't exist!");
}

但我不确定这是否会导致应用拒绝。你也许知道吗?

无论这种指针方法如何,我都很想知道是否有其他方法可以实现这一目标?

1 个答案:

答案 0 :(得分:0)

没有比在此主题上找到的建议解决方案更好的了。

#include <dlfcn.h>

// ...

int *pointer = dlsym(RTLD_SELF, "kSomeReallyNiceConstant");

if (pointer) {
    NSLog(@"Thing exists!");
} else {
    NSLog(@"Nope, doesn't exist!");
}