需要NSArray的内存管理澄清

时间:2011-01-12 01:02:21

标签: objective-c

说我有:

NSDictionary *stuff; // {"1" => "hi", "2" => "bye"}
NSArray *array = [stuff allKeys];

allKeys创建了一个副本的东西密钥,因此数组现在负责发布这些信息。

稍后,当我想要

我做不到:

array = [newStuff allKeys];

因为它只会重新分配指针并孤立原始数组。我必须先删除对象

[array removeAllObjects];

想知道我的理解是否正确?谢谢!

2 个答案:

答案 0 :(得分:5)

不完全。

NSArray *array = [stuff allKeys];

这为您提供了一个您不拥有的数组。从技术上讲,它是否是副本不是你的问题。由于访问器不以单词“alloc”或“new”开头,或包含单词“copy”,因此您不拥有返回值,这意味着您不需要释放它。 (但如果你想保留它,你确实需要保留它。)

如果你以后这样做:

array = [newStuff allKeys];

没关系。正如你所知,它会踩踏原始引用,但由于你还没有拥有该引用,所以可以放手。当然,除非你保留它,否则这个新的参考文献也不属于你。

答案 1 :(得分:0)

没有。 allKeys会返回自动释放的NSArray。除非您明确retain,否则它将在稍后发布。因此设置array = [newStuff allKeys];非常好。您应该阅读this guide on Objective-C