【问题标题】:Is it possible to enable non-arc files without adding "fno-objc-arc" in compile sources of Build Phases?是否可以在构建阶段的编译源中不添加“fno-objc-arc”来启用非弧文件?
【发布时间】:2014-03-22 12:42:59
【问题描述】:

是否可以在不将fno-objc-arc 添加到构建阶段的编译源的情况下以某种方式处理非弧文件?更具体地说,有没有办法在代码中的某处添加fno-objc-arc?原因是,我想开源我的一个使用非弧文件的库,我不希望使用我的库的人手动添加fno-objc-arc。只需拖放...

【问题讨论】:

  • 它是编译器标志,而不是运行时标志,因此您只能在编译器中设置它,而不是在源代码中。

标签: ios automatic-ref-counting


【解决方案1】:

没有。但是,如果您查看某些库的功能,它们会编写有条件地调用 MRC 调用的宏,例如 releaseautorelease 等,具体取决于用户是否使用 ARC 进行编译,例如使用__has_feature(objc_arc) 测试。然后代码使用这些宏,而不是标准的releaseretainautorelease 调用。通过仔细实施,您可以拥有一个同时支持 ARC 和 MRC 的代码库。

例如,查看 FMDB 库的FMDatabase.h。实际上,您将 MRC 调用替换为这些宏,它们只会有条件地被包含,具体取决于项目是否使用 ARC。

#if ! __has_feature(objc_arc)
    #define FMDBAutorelease(__v) ([__v autorelease]);
    #define FMDBReturnAutoreleased FMDBAutorelease

    #define FMDBRetain(__v) ([__v retain]);
    #define FMDBReturnRetained FMDBRetain

    #define FMDBRelease(__v) ([__v release]);
#else
    // -fobjc-arc
    #define FMDBAutorelease(__v)
    #define FMDBReturnAutoreleased(__v) (__v)

    #define FMDBRetain(__v)
    #define FMDBReturnRetained(__v) (__v)

    #define FMDBRelease(__v)
#endif

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多