此处仍在学习Objective-C / iPhone SDK。我想我知道为什么这不起作用但我只想确认一下。
在awakeFromNib
中,如果我使用[[NSMutableDictionary alloc] initWithObjects:...]
,它实际上会使用此NSMutableDictionary
数据分配(iPhone)系统内存,但当我使用[NSMutableDictionary dictionaryWithObjects:...]
时,它仅在堆叠吧?
例如,将来如果我尝试通过IBAction按下按钮来访问myMutableDict
,myMutableDict
对象可能已被释放,导致我的应用程序崩溃,即使我已定义它就像在我的.h文件中一样,并合成它:
@property (nonatomic, retain) NSMutableDictionary *myMutableDict;
由于某些原因,更改为[[NSMutableDictionary alloc] initWithObjects:...]
修复此问题。
答案 0 :(得分:15)
+dictionaryWithObjects:
返回自动释放的词典
-initWithObjects:
你必须释放自己
如果你希望字典作为实例变量持久存在,你应该使用init方法创建它或者保留一个自动释放的版本,无论哪种方式,你都应该确保在你的dealloc方法中释放它
关于此主题的优秀资源是Memory Management Programming Guide for Cocoa。
答案 1 :(得分:3)
为了扩展另一个答案,你会遗漏一些微妙的事情。
首先,Objective-C中没有堆栈对象。所有对象都存在于堆上,如上所述,一个表单是“自动释放”。
此外,您可能直接设置实例变量,绕过@synthesize
'访问器和更改器的内存管理。而不是:
myMutableDict = [NSMutableDictionary dictionaryWithObjects:...];
你应该说
self.myMutableDict = [NSMutableDictionary dictionaryWithObjects:...];
或者您必须手动添加保留或删除自动释放,如您所发现的那样。
再次阅读内存管理指南。它详尽地解释了所有这些。