2

我在@implementation 文件中定义了一些常量字符串,例如:

static NSString * const contentDisplayDateKeyPath   = @"content.display_date";
static NSString * const contentIDKeyPath            = @"content.id";

我可以使用在运行时保存变量名称的字符串来获取 contentDisplayDateKeyPath 的内容吗?

前任:

NSString *constantName = @"contentDisplayDateKeyPath"

[self valueForKey:constantName] 

然后我会得到 content.display_date

这可以实现吗?

我正在尝试通过使用 CFBundleGetDataPointer 来实现这一点

    CFBundleRef mainBundle = CFBundleGetBundleWithIdentifier(CFBridgingRetain([[NSBundle mainBundle] bundleIdentifier]));
    void *stringPointer = CFBundleGetDataPointerForName(mainBundle, CFBridgingRetain(obj));
    NSString *string = (__bridge NSString *)stringPointer;

但 stringPointer 始终为空。

感谢帮助

4

4 回答 4

2

这应该为你做。

NSString *__autoreleasing *string = (NSString*__autoreleasing*)dlsym(RTLD_DEFAULT, "<name of constant like PKPaymentNetworkVisa>");
NSLog(@"%@", *string);
于 2015-06-26T18:06:47.433 回答
0

另一种选择是将其封装到一个单例对象中,并通过只读属性访问您的常量。查看我的 Objective-C 单例应该是什么样的?查看单例设计模式。

于 2013-11-13T09:47:59.400 回答
0

使用以键为常量名、值为常量值的映射:

static NSDictionary *_constants = @{

    @"contentDisplayDateKeyPath" : @"content.display_date",
    @"contentIDKeyPath"          : @"content.id",
    // etc.
};

...

NSString *constantName = @"contentDisplayDateKeyPath";
NSString *constantValue = _constants[constantName];
于 2013-11-13T09:43:13.230 回答
0

这个问题在这里得到了回答:

如何在 Objective-C 运行时查找字符串常量?

该解决方案对我来说非常有效。

您可以使用CFBundleGetDataPointerForName在运行时查找常量的值

-(NSString *)lookupStringConstant:(NSString *)constantName 
{

    void ** dataPtr = CFBundleGetDataPointerForName(CFBundleGetMainBundle(), (__bridge CFStringRef)constantName);
    return (__bridge NSString *)(dataPtr ? *dataPtr : nil);
}
于 2016-01-26T05:32:28.253 回答