iPhone:添加到子视图时内存的工作原理

时间:2011-06-23 22:15:42

标签: iphone objective-c

一般性问题:当您向UIView添加项目时,是否会将所有者数量增加1?您现在添加项目的主视图是否也成为所有者?

示例:

mainView = [[UIView alloc] init];
UILabel *label = [[UILabel alloc] init];
[mainView addSubview:label] //does this increase owner count by 1?
[label release] //and this decreases it by 1?

2 个答案:

答案 0 :(得分:3)

发布 retain / init。

当您致电addSubview:时,它会增加保留计数(或者您所说的所有者计数)。但这种增加属于mainView。因此,将来mainView最多可以释放子视图,而不是你。

因此,当您init标签时,它会将保留计数增加到1.当您调用addSubview:label时,它会将保留计数增加1,然后再将其设置为2.然后释放标签,减少保留计数回到1并抵制你以前的初始。

然后当从mainView中删除标签时,其保留计数将返回到0并将被取消分配。

永远不要使用方法retainCount,无论您是观察它还是采取行动。由于很多幕后代码,此方法不会显示您所期望的内容。只是不要使用retainCount

答案 1 :(得分:1)

子视图存储在NSArray中,它会为添加的每个对象发送一个保留。原则上,是保留计数按预期进行,但实际上,由于API本身幕后发生的所有保留和释放,您实际上永远无法可靠地观察保留计数。试图直接跟踪保留计数只会导致悲伤。

最好只遵循以下规则:如果使用new或alloc-init创建对象,则释放它。如果你不做前者,你就不要做了。