2012-02-19 64 views
0

如何删除对象? 例如,我有NSDictionary中,并从它的一些NSString的:在obj-c中删除对象

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

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

如果我会删除不自动释放字典,将所有子去掉吗?

回答

3
Memory management

是基于对象的所有权。如果您拥有该对象,则必须释放该对象。
可可设置了以下政策:

你拥有的任何对象创建
您创建使用名称以“黄金”的方法的对象,“新”,“复制”,或“mutableCopy “(例如,alloc,newObject或mutableCopy)。

您可以使用retain获取对象的所有权。

当你不再需要它,你必须放弃对象的所有权您拥有
您可以通过发送一个释放消息或一个自动释放消息的放弃对象的所有权。

你一定不会放弃对象的所有权,你没有自己的先前的策略规则

这只是推论,明确说明。
在你的情况

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

你是不是海峡的拥有者,所以你不应该释放该对象。

2

删除你将不得不作出一个可变对象的特定对象。

大多数目标c的DAT类型mutable

NSMutableDictionary,NSMutableArray..etc 

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

Releasingauto releasing对象是完全不同的thing..it还将释放出整个对象(Dict..array..etc)走的是记忆..

1

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

strdict保留,如果你没有它叫retain比你不应该调用它release

,你应该从未调用dealloc任何对象


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

dict是意味着它将在下次运行循环被释放,如果你没有保留任何地方

一个autoreleased对象

一切都在dict由它保留,因此他们不会被释放,直到dict被释放

2

如果呼叫没有结束retaincopymutableCopyallocnew你不能使用releaseautorelease。该对象已经自动发布。

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。这是在您的- (void)dealloc方法。

如果字典被释放它包含所有得到释放的对象和键。如果他们没有保留在别的地方,他们也会被释放。

有大量可用的内存容量管理文档。例如苹果的目标C Advanced Memory Management Programming Guide