我正在控制器中创建一个按钮(存在于我的视图中)的outletCollection。由于视图已经强烈引用它包含的按钮。在创建此集合时,Xcode添加了此代码
@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *cardButtons;
请注意上面的强关键字。
我的问题是:
a)如果使用弱代而不是强代码,为什么此代码会中断?
b)数组的所有权是否会让我拥有它所包含的对象?
我对此的看法:
数组只是指针的集合(在本例中)。由于这些指针所指向的堆的部分已经被视图所拥有,所以我不能再遵循了这一点:)
答案 0 :(得分:2)
使用强引用定义的数组。如果你使cardButtons
弱,那么就不会有任何其他对数组的引用,并且数组将被释放。
按钮仍然存在,因为它们的父视图仍然有对它们的引用。
由于您需要保留对数组的引用,因此将其属性定义为strong。
数组是强,弱还是分配对按钮没有影响。
答案 1 :(得分:2)
视图保留了UIButtons 奇异,但NSArray不是。因此,如果您不保留NSArray,您可以在需要时访问按钮(例如,作为视图的子视图),但您无法通过阵列访问它们。
是的,默认情况下,数组会为您提供元素的所有权。
答案 2 :(得分:2)
A)对集合数组的引用必须很强,因为视图不引用数组本身。只有您要附加集合的类才具有对它的引用,因此它必须是强引用。如果它很弱,那么数组的元素仍然会在内存中,但数组本身会被释放。
B)除非您使用-[NSValue valueWithNonretainedObject:]
答案 3 :(得分:1)
a)如果使用弱而不是强
,为什么此代码会中断
因为在收集的情况下,IB
创建NSArray
的实例并将所有引用放入其中。你想保留数组的那个实例(注意,不是它中的对象,已经存在对它们的强引用),因为它不再有对它的引用。如果您不拥有阵列 - 没有人拥有,它将立即释放。您可以尝试将NSArray
替换为NSPointerArray - 例如,它没有对内部对象的强引用。
是的,它会破坏你的代码。
b)数组的所有权是否会给我对象的所有权 包含?
是的,已经存在的集合没有保留引用,我认为它只是旧模板,并且在不久的将来Apple将使用它们。 (例如NSPointerArray和NSMapTable),因为目前的最佳做法是strong
引用最顶层视图(self.view
)和weak
其子视图