通过名称(反射)访问iOS SDK常量
在iOS SDK内部,可以找到许多由Apple定义的常量,如下所示:通过名称(反射)访问iOS SDK常量,ios,reflection,constants,Ios,Reflection,Constants,在iOS SDK内部,可以找到许多由Apple定义的常量,如下所示: extern const CFStringRef kSomeReallyNiceConstant __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_8_0); 如果我检查是否存在这种恒定的标准方式: if (NULL == &kSomeReallyNiceConstant) 我几乎是在引用它,为了使我的代码能够正确编译,在本例中,我至少需要iOSSDK8.0或更高版
extern const CFStringRef kSomeReallyNiceConstant
__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_8_0);
如果我检查是否存在这种恒定的标准方式:
if (NULL == &kSomeReallyNiceConstant)
我几乎是在引用它,为了使我的代码能够正确编译,在本例中,我至少需要iOSSDK8.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!");
}
#include <dlfcn.h>
// ...
int *pointer = dlsym(RTLD_SELF, "kSomeReallyNiceConstant");
if (pointer) {
NSLog(@"Thing exists!");
} else {
NSLog(@"Nope, doesn't exist!");
}
#包括
// ...
int*pointer=dlsym(RTLD_SELF,“kSomeReallyNiceConstant”);
如果(指针){
NSLog(@“东西存在!”);
}否则{
NSLog(@“不,不存在!”);
}
但我不确定这是否会导致应用程序被拒绝。你可能知道吗
不管这种指针方法如何,我很想知道是否还有其他方法可以实现这一点?没有什么比在这个主题上找到的建议解决方案更好的了
#包括
// ...
int*pointer=dlsym(RTLD_SELF,“kSomeReallyNiceConstant”);
如果(指针){
NSLog(@“东西存在!”);
}否则{
NSLog(@“不,不存在!”);
}