【问题标题】:Why does ARC autorelease when using weak references?为什么使用弱引用时 ARC 会自动释放?
【发布时间】:2013-05-11 02:07:26
【问题描述】:

为什么 ARC 不能使用常规版本?

例子:

[weakObject doSomething];

据我了解,ARC 将其变为:

Object *strongObject = objc_autorelease(objc_loadWeakRetained(weakObject));
[strongObject doSomething];

为什么 ARC 不这样做呢?:

Object *strongObject = objc_loadWeakRetained(weakObject);
[strongObject doSomething];
objc_release(strongObject);

我想尽可能多地取消 ARC 中的自动发布。我用 GCD 做了很多异步线程,最终不得不添加很多自动释放池:

dispatch_async(self.myQueue, ^{
    @autoreleasepool{
        [weakObject doSomethingBig];
    }
});

【问题讨论】:

  • 基本上缺乏足够智能的编译器。可能值得一个错误报告,尽管它可能已经提交并且肯定是已知的。
  • 你从哪里得到weakObject?

标签: objective-c automatic-ref-counting


【解决方案1】:

我无法解释为什么 ARC 编译器会这样做,但是 如果我正确理解生成的汇编代码,请使用以下模式

dispatch_async(self.myQueue, ^{
    Object *strongObject = weakObject;
    [strongObject doSomething];
});

被翻译成objc_loadWeakRetained(), ..., objc_release(),这样对象 未放入自动释放池中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-25
    • 2014-06-17
    • 2011-09-17
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多