Iphone [[NSMutableDictionary alloc]initWithObjects:…]和[NSMutableDictionary Dictionary WithObjects:…]之间的差异?

Iphone [[NSMutableDictionary alloc]initWithObjects:…]和[NSMutableDictionary Dictionary WithObjects:…]之间的差异?,iphone,objective-c,cocoa,memory-management,Iphone,Objective C,Cocoa,Memory Management,还在这里学习Objective-C/iPhone SDK。我想我知道为什么这不起作用,但我只是想确认一下 在awakeFromNib中,如果我使用[[NSMutableDictionary alloc]initWithObjects:…]它实际上用这个NSMutableDictionary数据分配(iPhone)系统内存,但是当我使用[NSMutableDictionary dictionary withobjects:…]它只在堆栈中可用,对吗 例如,在将来,如果我试图通过iAction通过按

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

awakeFromNib
中,如果我使用
[[NSMutableDictionary alloc]initWithObjects:…]
它实际上用这个
NSMutableDictionary
数据分配(iPhone)系统内存,但是当我使用
[NSMutableDictionary dictionary withobjects:…]
它只在堆栈中可用,对吗

例如,在将来,如果我试图通过iAction通过按键访问
myMutableDict
,则
myMutableDict
对象可能已被释放,导致我的应用程序崩溃,即使我在.h文件中这样定义并合成了它:

@property (nonatomic, retain) NSMutableDictionary *myMutableDict;

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

+dictionary WithObjects:
返回自动删除的词典
-initWithObjects:
您必须释放自己

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


关于这个主题的一个很好的资源是。

要扩展另一个答案,您缺少一些微妙的东西

首先,Objective-C中没有堆栈对象。所有对象都位于堆上,其中一种形式如前所述是“自动删除”

另外,您可能正在直接设置实例变量,绕过
@synthesis
'd访问器和mutator中的内存管理。与此相反:

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

self.myMutableDict = [NSMutableDictionary dictionaryWithObjects:...];
否则,您必须手动添加保留或删除自动释放,正如您所发现的那样


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

因此,基本上,无论何时合成一个对象以在整个项目中使用,例如,您总是希望使用initWithDictionary,这样它就不会随机发布在您身上,对吗?对,或[[NSMutableDictionary WithObjects…]保留]相当于《苹果内存管理指南》中的TANOther+1。它很长,有时有点枯燥,但你至少需要跋涉一次才能知道发生了什么。一旦你仔细考虑了retain counts,它的运行就更加顺畅了。另外,+dictionaryWithObjects:calls-initWithObjects:并在返回结果实例之前自动删除它。科巴尔:不完全是那样,该对象的保留计数为2:一个来自其创建,当自动释放到期时将被减去,另一个来自显式保留。(新的Cocoa程序员们,这就是为什么您不应该关心
重新计数
——它不会告诉您有多少对象拥有该对象!)