删除obj-c中的对象

时间:2012-02-19 09:55:23

标签: objective-c ios cocoa-touch cocoa

我如何删除对象? 例如,我有NSDictionary和一些NSStrings:

NSDictionary *dict = [NSDictionary dictionaryWithObjects....];
NSString *str = [dict objectForKey:@"key"];

[str release];[str dealloc];str = nil或它的自动释放对象?

如果我不删除autorelease dict,那么所有孩子也会被删除吗?

4 个答案:

答案 0 :(得分:3)

目标c中的

Memory management基于对象所有权。如果您拥有该对象,则必须释放该对象 Cocoa设定了以下政策:

  

您拥有自己创建的任何对象
  使用名称以“alloc”,“new”,“copy”或“mutableCopy”开头的方法(例如,alloc,newObject或mutableCopy)创建对象。

     

您可以使用保留来获取对象的所有权。

     

当您不再需要它时,您必须放弃您拥有的对象的所有权
   您通过向对象发送释放消息或自动释放消息来放弃对象的所有权。

     

您不得放弃您不拥有的对象的所有权

这只是先前明确规定的政策规则的必然结果 在你的情况下

NSDictionary *dict = [NSDictionary dictionaryWithObjects....];
NSString *str = [dict objectForKey:@"key"];  

您不是str的所有者,因此您不应该释放该对象。

答案 1 :(得分:2)

删除您必须制作可变对象的特定对象。

大多数 objective-c 数据类型为mutable,例如

NSMutableDictionary,NSMutableArray..etc

然后只需调用.. [yourObject removeObjectatIndex:someInteger][yourObject RemoveAllObjects]即可删除对象。

Releasingauto releasing一个对象是完全不同的东西......它将释放整个对象(Dict..array..etc)所占用的内存..

答案 2 :(得分:2)

如果来电未以retaincopymutableCopyallocnew结束,则您不得使用release或{ {1}}。该对象已经自动释放。

autorelease

NSString *str = [[NSString alloc] initWithString:@"123"]; <- needs release NSString *str = [aString copy]; <- release NSString *str = [aString mutableCopy]; <- release NSString *str = [aString retain]; <- release NSString *str = [NSString new]; <- release everything else <- don't release. 只有一个有效用法。这是dealloc方法中的[super dealloc];

如果字典被解除分配,它所包含的所有对象和密钥都会被释放。如果他们没有留在其他地方,他们也会被解除分配。

有大量关于内存管理的文档。例如Apples Advanced Memory Management Programming Guide

答案 3 :(得分:1)

你是什​​么意思“删除”?假设你的意思是dealloc或free

{p> strdict保留,如果您未在其上致电retain,则不应在其上调用release

你应该从不dealloc调用到任何对象


NSDictionary *dict = [NSDictionary dictionaryWithObjects....];

dict是一个自动释放的对象,意味着如果你没有将它保留在任何地方,它将在下一个运行循环中被释放

dict中的所有内容都会被其保留,因此在dict被取消分配之前不会取消分配