我如何删除对象? 例如,我有NSDictionary和一些NSStrings:
NSDictionary *dict = [NSDictionary dictionaryWithObjects....];
NSString *str = [dict objectForKey:@"key"];
[str release];
或[str dealloc];
或str = nil
或它的自动释放对象?
如果我不删除autorelease dict,那么所有孩子也会被删除吗?
答案 0 :(得分:3)
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]
即可删除对象。
Releasing
或auto releasing
一个对象是完全不同的东西......它将释放整个对象(Dict..array..etc)所占用的内存..
答案 2 :(得分:2)
如果来电未以retain
,copy
或mutableCopy
,alloc
或new
结束,则您不得使用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)
str
由dict
保留,如果您未在其上致电retain
,则不应在其上调用release
。
你应该从不将dealloc
调用到任何对象
NSDictionary *dict = [NSDictionary dictionaryWithObjects....];
dict
是一个自动释放的对象,意味着如果你没有将它保留在任何地方,它将在下一个运行循环中被释放
dict
中的所有内容都会被其保留,因此在dict
被取消分配之前不会取消分配