[[NSMutableDictionary alloc] initWithObjects:...]和[NSMutableDictionary dictionaryWithObjects:...]之间的区别?

时间:2009-07-11 21:41:45

标签: iphone objective-c cocoa memory-management

此处仍在学习Objective-C / iPhone SDK。我想我知道为什么这不起作用但我只想确认一下。

awakeFromNib中,如果我使用[[NSMutableDictionary alloc] initWithObjects:...],它实际上会使用此NSMutableDictionary数据分配(iPhone)系统内存,但当我使用[NSMutableDictionary dictionaryWithObjects:...]时,它仅在堆叠吧?

例如,将来如果我尝试通过IBAction按下按钮来访问myMutableDictmyMutableDict对象可能已被释放,导致我的应用程序崩溃,即使我已定义它就像在我的.h文件中一样,并合成它:

@property (nonatomic, retain) NSMutableDictionary *myMutableDict;

由于某些原因,更改为[[NSMutableDictionary alloc] initWithObjects:...]修复此问题。

2 个答案:

答案 0 :(得分:15)

+dictionaryWithObjects:返回自动释放的词典
-initWithObjects:你必须释放自己

如果你希望字典作为实例变量持久存在,你应该使用init方法创建它或者保留一个自动释放的版本,无论哪种方式,你都应该确保在你的dealloc方法中释放它

关于此主题的优秀资源是Memory Management Programming Guide for Cocoa

答案 1 :(得分:3)

为了扩展另一个答案,你会遗漏一些微妙的事情。

首先,Objective-C中没有堆栈对象。所有对象都存在于堆上,如上所述,一个表单是“自动释放”。

此外,您可能直接设置实例变量,绕过@synthesize'访问器和更改器的内存管理。而不是:

myMutableDict = [NSMutableDictionary dictionaryWithObjects:...];
你应该说

self.myMutableDict = [NSMutableDictionary dictionaryWithObjects:...];

或者您必须手动添加保留或删除自动释放,如您所发现的那样。

再次阅读内存管理指南。它详尽地解释了所有这些。