繁体   English   中英

iPhone-有关保留数组的问题

[英]iphone - a question about retaining an array

我对Objective-C有点陌生,我试图了解有关此保留释放机制的一些知识。

假设我需要一个数组来维持应用程序的整个生命周期。 因此,假设我使用类似的方法创建数组

myArray = [[NSMutableArray alloc] init];

在应用程序的开头。

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

  1. 分配数组时,添加到该数组的对象将始终处于活动状态并且永不释放吗?

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

谢谢

第一个问题的答案是肯定的 -根据定义,任何集合对象都将保持其收集的对象处于活动状态,直到集合本身被释放为止。

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

例如:

[[[NSArray alloc] init] autorelease];

不是内存泄漏(和你没有自己的对象)假设有一个可用的自动释放池。

基本是在保留计数达到0时释放对象。

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

关于自动释放对象---自动释放仅讨论当前所有权,因此,当您将自动释放对象添加到数组集合时,数组将保留计数增加1并拥有所有权。 自动释放会在其周期中将保留计数减少1。 (仍然还有1个保留计数来释放对象)

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

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

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

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

将“自动释放”发送到对象会将其添加到封闭的自动释放池中。 这意味着当自动释放池被耗尽/释放时,将向对象发送释放消息。 对象是否将被释放取决于其他一些代码是否保留了它。

分配数组时,添加到该数组的对象将始终处于活动状态并且永不释放吗?

在正常情况下,即在您不过度释放它们的情况下,它们会。 例如,

// 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发送到要添加的对象,因此获得该对象的所有权,而与拥有(或不拥有)该对象的其他代码无关。

内存管理和对象所有权的全部要点是相对考虑所有权:如果集合需要一个对象,它将获取该对象的所有权; 如果发布了集合或从集合中删除了对象,它将放弃对象的所有权。 该集合并不关心该对象是否由其他对象或代码拥有,而是仅关注其拥有该对象的角度。 同样的原则也适用于您的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM