2011-01-12 26 views
0

说我有:需要一个内存管理澄清WRT的NSArray

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

allKeys使得东西的密钥的副本,所以阵列现在负责发布该信息。

后来,当我想

我不能这样做:

array = [newStuff allKeys]; 

,因为它只是重新分配的指针和孤儿原来的数组。我必须先删除物体

[array removeAllObjects]; 

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

回答

5

不完全。

NSArray *array = [stuff allKeys]; 

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

如果以后这样做:

array = [newStuff allKeys]; 

这很好。正如你所知道的那样,它会跺脚于原始的参考,但由于你无论如何都不拥有这个参考,所以可以放手。当然,除非你保留它,否则这个新的参考文献也不是你的。

+0

通常,如果方法名称不包含alloc,copy或new,则不必释放它。 – LandonSchropp 2011-01-12 01:10:59

0

编号allKeys返回自动发放NSArray。它会在稍后发布,除非你明确地retain它。所以设置array = [newStuff allKeys];是非常好的。您应该阅读this guide on Objective-C