【问题标题】:Disable ARC on specific lines of code [duplicate]在特定代码行上禁用 ARC [重复]
【发布时间】:2015-07-29 17:54:45
【问题描述】:

我正在将一个项目转换为 ARC,但有些代码只能在禁用 ARC 的情况下工作。我意识到 -fno-objc-arc 可用于在每个文件的基础上禁用 ARC。但是我想知道是否可以在每个功能的基础上禁用 ARC。

我知道警告可以在例如每行的基础上切换

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Weverything"
// Code goes here
#pragma clang diagnostic pop

ARC 有类似的东西吗? (以下是我的假设)

#pragma clang diagnostic push
#pragma clang diagnostic flag "-fno-objc-arc"
// Code goes here
#pragma clang diagnostic pop

【问题讨论】:

  • “只能在禁用 ARC 的情况下工作”听起来有点可疑。如果属实,则表明存在无法在 ARC 环境中编写的程序。
  • 是的。有些东西不能用ARC写。例如,具有目标 c 对象的结构。这在 ARC 中是不允许的,将结构移植到类不是一种选择。
  • 逐行执行会禁用 ARC 进行 RR 优化的某些能力——据我所知,基本上使 ARC 本身对于包含该行的范围毫无意义。在范围基础上禁用它——例如每个函数/方法——似乎是可能的,但可能不足以证明维护的合理性。
  • @Calimari328 你不能在 Obj-C 的结构中使用 obj-c 引用,但你可以在 Objective-C++ 中使用。

标签: ios objective-c clang automatic-ref-counting llvm


【解决方案1】:

这是不可能的。您必须将非 ARC 代码移动到单独的文件中。如果这是 Obj-C 类中的代码,也许您可​​以将相关方法移到一个类别中。

编辑:

使用 Objective-C++ 可以绕过 ARC 在 Obj-C 中的一些限制。例如,您可以将 Obj-C 引用放在结构中。 (因为它们可以在 C++ 中使用反初始化器)

编辑:

此代码适用于我:

test.h

#import <Foundation/Foundation.h>

struct Struct {
    id ref ;
    NSDate * date ;
};

ma​​in.mm

#import "test.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool
    {
        Struct a ;
        a.ref = [ NSObject new ] ;

        Struct * a2 = new Struct() ;
        a2->ref = [ NSObject new ] ;
        free( a2 ) ;
    }

    return 0;
}

【讨论】:

  • 你能举个例子吗?我试着把 struct Example { NSDate*d; } 在 .h 文件中然后将其 .m 变成 .mm 但它仍然说它不能这样做。我错过了什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-21
  • 2017-08-26
  • 1970-01-01
相关资源
最近更新 更多