【问题标题】:Mark an object un-AutoRelease in ARC在 ARC 中将对象标记为取消自动释放
【发布时间】:2016-02-16 08:45:25
【问题描述】:

众所周知,当没有变量引用对象时,对象不会立即在 ARC 中解除分配。例如,

NSObject* obj = [[NSObject alloc] init];
obj = nil;

obj 将在一段时间后释放。(自动释放池耗尽)。

现在,我想要 obj dealloc 在它被设置为 nil 之后立即,这意味着 obj 不在自动释放池中。但是所有其他的 obj 都应该像以前一样正常工作,这意味着程序仍处于 ARC 模式。

有没有办法(可能是宏或编译器标志)来做到这一点?

【问题讨论】:

  • 分配时并不是所有的对象都会在自动释放池中移动。为此需要使用 __autoreleasing。例如 [NSArray array] 将在自动释放池中移动,但 [[NSArray alloc] init] 不会。

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


【解决方案1】:

首先:您不应该关心提前释放。这是一种强烈的代码气味。

第二:你真的,真的确定吗,因为-init 将对象放入 ARP。也许表达式会导致保留自动释放组合,但在发布模式下编译应该会优化它。

但是,如果它在 ARP 中,您可以按照 Hermann Klecker 所述关闭 ARP,或者——我认为这更好——找到在 ARP 中成为该对象的原因。没有必要。

【讨论】:

    【解决方案2】:

    Amin is right: 对象不在自动释放池中。创建对象的alloc 不参与池。另一方面,你是对的:ARC 可能不会立即释放对象。

    确实有一个注释可以用来强制释放:objc_precise_lifetime。将其添加到变量声明中将导致 ARC 在对象在当前范围内不再有效时立即发送release

    但是,Amin 也是对的,这不太可能是您想要的。 ARC 知道它在做什么——当你使用这个注解时它无法进行优化——除非你也知道它在做什么,否则你应该强烈考虑让它完成它的工作。

    【讨论】:

    • 这正是我想要的。谢谢你的好意。
    猜你喜欢
    • 2013-09-07
    • 2012-09-11
    • 2011-12-18
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多