【问题标题】:Read Info.plist from prefix.pch从 prefix.pch 中读取 Info.plist
【发布时间】:2012-11-27 14:19:34
【问题描述】:

是否可以从我的 Info.plist 文件中的 prefix.pch 文件中读取一个值并根据该值设置一个宏?

例如,如果我在 Info.plist 中有一个名为 UseSomeResource 的布尔属性,如果该属性的值为 YES,我想创建一个 #define USE_SOME_RESOURCE 1

【问题讨论】:

    标签: ios xcode cocoa-touch plist info.plist


    【解决方案1】:

    理论上是的,尽管我不认为 .pch 是放置它的最佳位置。我建议将此宏放在您在 .pch 中导入的 Macros.h 或类似机制中

    #define USE_SOME_RESOURCE ([[[[NSBundle mainBundle] infoDictionary] objectForKey:@"UseSomeResource"] boolValue])
    

    More about .pch can be read here

    值得注意的是,这仍然会在运行时确定值,而不是在编译时。如果您希望它在编译时运行,您可能需要编写一个脚本作为构建阶段之一的一部分,该脚本读取 Info.plist,并创建一个头文件,然后将其作为项目的一部分包含在内。这似乎是一种迂回的方法,因此我强烈建议使用运行时替代方法。

    【讨论】:

    • 感谢您的回答。而且,您已经回答了我的下一个问题,即这是在运行时还是编译时完成的。这个宏应该替换现有的解决方案,我们从类中读取UseSomeResource 属性的值。这个想法是有一个#ifdef 宏,这样我们的执行就不会被不必要的检查所污染。但这真的有意义吗?我的意思是,#ifdef 在编译时被调用,所以我猜我不能将它与在运行时确定的值一起使用。无论如何,如果这是在运行时完成的,我可能会坚持当前的解决方案。
    • 出于好奇,为什么要将这个宏放在导入到 .pch 的 hader 文件中,而不是直接在其中执行?
    • 个人喜好,没有什么能阻止你直接放进去。更多的是让代码更整洁一些,如果宏出现问题,我知道检查宏头文件;不必发现它们实际上包含在 .pch 中。
    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    相关资源
    最近更新 更多