如果我不想拥有它包含的对象的所有权,为什么要拥有一个数组呢?

时间:2014-04-19 17:32:24

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

我正在控制器中创建一个按钮(存在于我的视图中)的outletCollection。由于视图已经强烈引用它包含的按钮。在创建此集合时,Xcode添加了此代码 @property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *cardButtons;

请注意上面的强关键字。
我的问题是:

a)如果使用弱代而不是强代码,为什么此代码会中断?

b)数组的所有权是否会让我拥有它所包含的对象?

我对此的看法:
数组只是指针的集合(在本例中)。由于这些指针所指向的堆的部分已经被视图所拥有,所以我不能再遵循了这一点:)

4 个答案:

答案 0 :(得分:2)

使用强引用定义的数组。如果你使cardButtons弱,那么就不会有任何其他对数组的引用,并且数组将被释放。

按钮仍然存在,因为它们的父视图仍然有对它们的引用。

由于您需要保留对数组的引用,因此将其属性定义为strong。

数组是强,弱还是分配对按钮没有影响。

答案 1 :(得分:2)

视图保留了UIButtons 奇异,但NSArray不是。因此,如果您不保留NSArray,您可以在需要时访问按钮(例如,作为视图的子视图),但您无法通过阵列访问它们。

是的,默认情况下,数组会为您提供元素的所有权。

答案 2 :(得分:2)

A)对集合数组的引用必须很强,因为视图不引用数组本身。只有您要附加集合的类才具有对它的引用,因此它必须是强引用。如果它很弱,那么数组的元素仍然会在内存中,但数组本身会被释放。

B)除非您使用-[NSValue valueWithNonretainedObject:]

,否则NSArray始终拥有其数组内容的所有权

答案 3 :(得分:1)

  

a)如果使用弱而不是强

,为什么此代码会中断

因为在收集的情况下,IB创建NSArray的实例并将所有引用放入其中。你想保留数组的那个实例(注意,不是它中的对象,已经存在对它们的强引用),因为它不再有对它的引用。如果您不拥有阵列 - 没有人拥有,它将立即释放。您可以尝试将NSArray替换为NSPointerArray - 例如,它没有对内部对象的强引用。

是的,它会破坏你的代码。

  

b)数组的所有权是否会给我对象的所有权   包含?

是的,已经存在的集合没有保留引用,我认为它只是旧模板,并且在不久的将来Apple将使用它们。 (例如NSPointerArrayNSMapTable),因为目前的最佳做法是strong引用最顶层视图(self.view)和weak其子视图