我是Objective-C的新手,我正在尝试理解有关此保留释放机制的一些内容。
假设我需要一个数组来持续应用程序的整个生命周期。所以,假设我使用
之类的东西创建数组myArray = [[NSMutableArray alloc] init];
在应用的开头。
在应用程序期间,此数组可能删除了所有对象,添加了来自其他数组的对象等。另外,假设在添加对象的其中一个操作中,我将自动释放的对象添加到数组中。两个问题:
添加到该数组的对象是否始终处于活动状态,并且在分配数组时从不取消分配?
我知道向数组添加对象会增加其保留计数。这对自动释放的对象也有效吗? (也许来自其他方法的自动释放数组)
感谢
答案 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
发送到正在添加的对象,因此获得该对象的所有权,而不管拥有(或不拥有)该对象的其他代码。
内存管理和对象所有权的重点是以相对的方式考虑所有权:如果集合需要一个对象,它将取得对象的所有权;如果集合被释放或者对象从集合中移除,它将放弃对象的所有权。集合并不关心其他对象或代码所拥有的对象 - 它只关心自己拥有对象的观点。同样的原则应该适用于您的代码。