1

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

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

4

5 回答 5

3
  1. 你的代码应该是结构化的,所以这个问题的答案并不重要——如果你想使用一个对象,保留一个指向它的指针,不要依赖 ARC 副作用来保持它:) 这些副作用可能会随着不同的编译器。

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

于 2012-06-20T17:50:49.083 回答
0

Ok, first this answer might helpt you also a little bit: ARC equivalent of autorelease?

Generally after the last strong variable is nilled, the object is released immediately. If you store it in a property, you can nil the property, assign it to something like __strong Foo *temp = self.bar; before you nil, and return that local __strong variable (although arc normally detects the return, and inferes the __strong byitself).

Some more details on that: Handling Pointer-to-Pointer Ownership Issues in ARC

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

  2. 如果您将一个对象从一个类传递到另一个类,并且接收类具有与之关联的强属性,并且传递它的类最终将其指针归零,那么它的引用计数仍然至少为 1 并且会很好。

于 2012-06-20T17:42:50.963 回答
0

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

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

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

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

于 2012-06-20T17:55:47.040 回答
-1

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

在此处输入图像描述

于 2016-03-14T10:35:03.253 回答