iphone - 关于保留阵列的问题

时间:2011-01-23 14:13:01

标签: iphone objective-c

我是Objective-C的新手,我正在尝试理解有关此保留释放机制的一些内容。

假设我需要一个数组来持续应用程序的整个生命周期。所以,假设我使用

之类的东西创建数组
myArray = [[NSMutableArray alloc] init];

在应用的开头。

在应用程序期间,此数组可能删除了所有对象,添加了来自其他数组的对象等。另外,假设在添加对象的其中一个操作中,我将自动释放的对象添加到数组中。两个问题:

  1. 添加到该数组的对象是否始终处于活动状态,并且在分配数组时从不取消分配?

  2. 我知道向数组添加对象会增加其保留计数。这对自动释放的对象也有效吗? (也许来自其他方法的自动释放数组)

  3. 感谢

5 个答案:

答案 0 :(得分:1)

第一个问题的答案是 - 根据定义,任何集合对象都会保留其收集的对象,直到集合本身被解除分配。

至于你的第二个问题,一个发送autorelease消息的对象将所有权转移到当前的自动释放池,直到该对象被另一个作用域拥有,此时该对象被从该对象中删除。池。

例如:

[[[NSArray alloc] init] autorelease];
假设有可用的自动释放池,

内存泄漏(并且您不拥有该对象)。

答案 1 :(得分:0)

当达到保留计数0时,基础是对象被释放。

现在回答你的问题:数组中的对象拥有其对象的所有者。因此,在释放数组之前,将保留数组集合中的对象。

关于autorelease对象--- autorelease只讨论当前的所有权,所以当你将一个自动释放的对象添加到数组集合时,数组会将保留计数增加1并拥有所有权。自动释放将使其周期中的保留计数减少1。 (你还有另外一个保留计数来释放对象)

注意:自动释放 - 将对象添加到自动释放池将使保留计数在其耗尽周期中递减---只有在保留计数为0(没有所有者)时才会释放对象。

答案 2 :(得分:0)

我更喜欢在最后释放它而不是自动释放..控制何时释放它似乎是一个更好的选择..当dealloc只是:[myArray removeAllObjects]并且后面跟着[myArray release]时函数结束..

答案 3 :(得分:0)

如您所知,客观c对象是引用计数。当且仅当其引用计数达到零时,才会释放任何目标c对象,没有例外。

将对象添加到NSMutableArray时,该数组将保留该对象。这意味着,只要您没有在其他地方保留/释放对象,添加到数组中的对象将处于活动状态,直到(1)从数组中删除对象,以及(2)数组本身被释放,其中将释放存储在其中的每个对象。

向对象发送“autorelease”会将其添加到封闭的自动释放池中。这意味着当自动释放池被排空/解除分配时,将向对象发送释放消息。对象是否将被释放取决于是否有其他代码保留了它。

答案 4 :(得分:0)

添加到该数组的对象是否始终处于活动状态,并且在分配数组时从不取消分配?

他们将在正常情况下,即,如果你没有过度释放他们。例如,

// take ownership (alloc) followed by relinquish ownership (autorelease)
// the net result is that this code snippet DOES NOT own someObject
SomeClass *someObject = [[[SomeClass alloc] init] autorelease];

// myArray takes ownership of someObject
[myArray addObject:someObject];

// someObject is INCORRECTLY (over)released
[someObject release];

考虑到没有其他代码声明对someObject的所有权,它将不会“生效”,因为它已被过度发布。

我知道向数组添加对象会增加其保留计数。这对自动释放的对象也有效吗? (也许来自其他方法的自动释放数组)

是。在添加对象时,集合不会查看保留计数或自动释放状态,也不应该。数组只是将-retain发送到正在添加的对象,因此获得该对象的所有权,而不管拥有(或不拥有)该对象的其他代码。

内存管理和对象所有权的重点是以相对的方式考虑所有权:如果集合需要一个对象,它将取得对象的所有权;如果集合被释放或者对象从集合中移除,它将放弃对象的所有权。集合并不关心其他对象或代码所拥有的对象 - 它只关心自己拥有对象的观点。同样的原则应该适用于您的代码。