繁体   English   中英

目标内存管理

[英]objective-c memory management

假设我有一个包含其他对象的对象。 例如,NSMutableArray对象“列表”具有其他一些对象。

如果我不再使用它们,我可以只输入[list release]吗?

还是我必须按1释放列表中的对象? 即。

for (int i=0; i < [list count]; i++)
    [[list objectAtIndex(i)] release];

如果我必须一个接一个地做,如果我的对象中包含许多其他对象,是否会很麻烦? 假设一个Picture对象中包含各种Shape对象。 有没有更好的办法?

只要您对列表中的对象没有其他引用,那么仅释放NSMutableArray就足够了。

让我们检查一下代码片段,牢记可可内存管理规则 我将对其进行一些修改:

for (int i=0; i < [list count]; i++)
{
    id anObject = [list objectAtIndex(i)] ;
    [anObject release];
}

这仅仅是为了让我可以谈论anObject ,否则它与您的代码相同。

现在,您通过将objectAtIndex:发送到数组来获得anObject。 以下是规则中的相关报价:

如果使用名称以“ alloc”或“ new”开头或包含“ copy”(例如alloc,newObject或mutableCopy)的方法创建对象,或者向其发送保留消息,则您拥有该对象的所有权。 您有责任使用release或autorelease放弃您拥有的对象的所有权。 任何其他时间收到对象时,都不得释放它。

  • 是否ObjectAtIndex:以alloc开头? 没有。
  • objectAtIndex:是否以new开头? 没有。
  • objectAtIndex:是否包含副本? 没有。
  • 您保留了anObject吗? 没有。

因此,最后一个加粗的句子适用。

您不得释放anObject。 代码中的版本不正确。

我已经将上面的内容写了很长一段时间,并不是想让您失望,而是让您看起来很愚蠢,但是因为我过去常常发现这些东西与您一样困惑,并且是防止代码泄漏或崩溃的唯一方法是我在脑海中为我使用的每个对象几乎剔除了这四个问题的答案。 它很快就成为了第二本性,这样您就可以浏览一段代码并立即找出需要释放的内容。

如果执行以下操作,则不必释放每个对象,因为您无需在添加的对象上使用alloccopynew保持

NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:[NSNumber numberWithInt:15]];

但是,如果你将它添加到阵列之前ALLOC你的对象,你将要释放。

NSMutableArray *array = [[NSMutableArray alloc] init];
id anObject = [[MyObject alloc] init]
[array addObject:anObject];
[anObject release];

暂无
暂无

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

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