iOS 中的 ARC 问题

Posted

技术标签:

【中文标题】iOS 中的 ARC 问题【英文标题】:ARC in iOS questions 【发布时间】:2012-06-20 17:12:02 【问题描述】:

~ ARC 是否总是在最后一个强指针被删除后的行释放一个对象?或者它是未确定的,并且在未来某个未指定的时间点将被发布?同样,假设您没有对程序进行任何更改,那么每次运行和编译程序时 ARC 是否总是相同的?

~ 你如何处理将一个对象交给其他类?例如,假设我们在 Bakery 类中创建一个 Cake 对象。这个过程可能需要很长时间,涉及到很多不同的方法,所以我们把蛋糕放在strong property中可能是合理的。现在假设我们想把这个蛋糕对象交给客户。客户也可能希望有一个强有力的指针。这个可以吗?有两个具有指向同一个对象的强指针的类?或者我们应该在交接后立即取消Bakery's 指针吗?

【问题讨论】:

这应该是两个独立的帖子。这两个要点并不是密切相关。 【参考方案1】:
    1234563这些副作用可能会随着不同的编译器而改变。

    两个强指针绝对没问题。 ARC 只会在两个指针都指向其他东西(或什么都没有!)时释放对象

【讨论】:

【参考方案2】:

    ARC 将在编译时实现正确的保留和释放。它的行为与您自己将它们放在那里没有任何不同,因此它将始终进行相同的编译,并且回答您的问题的行为应该始终相同。但这并不意味着您的对象总是会在指针被删除后立即被释放。因为你从不直接以任何形式的目标 C 调用 dealloc,你只是告诉它没有引用计数并且释放它是安全的。这通常意味着它会立即发布。

    1234563会好的。

【讨论】:

【参考方案3】:

好的,首先这个答案可能对你也有一点帮助:ARC equivalent of autorelease?

一般在最后一个强变量nilled后,立即释放对象。如果将其存储在属性中,则可以将该属性设为 nil,将其分配给 __strong Foo *temp = self.bar; 之类的东西。在您为零之前,并返回该局部 __strong 变量(尽管 arc 通常会检测返回,并自行推断 __strong)。

更多细节:Handling Pointer-to-Pointer Ownership Issues in ARC

【讨论】:

【参考方案4】:

DeanWombourne 的回答是正确的;但要添加到 (1)。

特别是,作为优化的一部分,编译器可能会显着重新排序语句。虽然方法调用总是按照代码中编写的顺序发生(因为任何方法调用都可能有副作用),但编译器可以对任何原子表达式重新排序,只要该重新排序不影响行为即可。局部变量重用等也是如此......

因此,ARC 编译器将保证指针在需要时有效,不再需要。但是不能保证指向的对象何时可能被释放,除非它不会超出声明的范围。也不能保证对象 A 在 B 之前释放,仅仅因为 A 是在 B 之前声明和最后使用的。

换句话说,只要您在不依赖副作用和竞争条件的情况下编写代码,它就应该可以正常工作。

【讨论】:

【参考方案5】:

请保持您的代码正确,因为它在不同的编译器上具有不同的行为。

【讨论】:

以上是关于iOS 中的 ARC 问题的主要内容,如果未能解决你的问题,请参考以下文章

自动引用计数 (ARC) 中的 NSThreads

IOS开发 arc与非Arc代码的区别

IOS开发 arc与非Arc代码的区别

iOS 中 ARC 项目 兼容 MRC

Unity中的ARC ObjC代码?

iOS SDK:ARC removeFromSuperview