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

tab*_*ber 2 iphone cocoa memory-management objective-c

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

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

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

@property (nonatomic, retain) NSMutableDictionary *myMutableDict;
Run Code Online (Sandbox Code Playgroud)

由于某种原因改变到[[NSMutableDictionary alloc] initWithObjects:...]固定这个.

cob*_*bal 15

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

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

关于这个主题的一个很好的资源是Cocoa内存管理编程指南.

  • 苹果内存管理指南的另一个+1.它很长,有时有点沉闷,但你需要至少跋涉一次才能知道发生了什么.一旦你绕过保留计数,这将是一个更顺畅的航行. (4认同)
  • cobbal:不完全如此,与该解决方案一样,该对象将具有2的保留计数:一个来自其创建,并且将在自动释放到期时被减去,而另一个来自您的显式保留.(而且,新的Cocoa程序员,为什么你不应该关心`retainCount`-它确实*不*告诉你有多少对象拥有该对象!) (2认同)