【问题标题】:Difference between [[NSMutableDictionary alloc] initWithObjects:...] and [NSMutableDictionary dictionaryWithObjects:...]?[[NSMutableDictionary alloc] initWithObjects:...] 和 [NSMutableDictionary dictionaryWithObjects:...] 之间的区别?
【发布时间】:2009-07-11 21:41:44
【问题描述】:

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

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

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

@property (nonatomic, retain) NSMutableDictionary *myMutableDict;

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

【问题讨论】:

    标签: iphone objective-c cocoa memory-management


    【解决方案1】:

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

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

    Memory Management Programming Guide for Cocoa 是关于这个主题的一个很好的资源。

    【讨论】:

    • 所以基本上任何时候你合成一个对象以在整个项目中使用或其他任何东西,例如,你总是想使用 initWithDictionary 这样它就不会随机释放到你身上,对吗?跨度>
    • 正确,或者[[NSMutableDictionary dictionaryWithObjects...] retain] 是等价的
    • Apple 的内存管理指南的另一个 +1。它很长,有时有点乏味,但你需要至少翻阅一次才能知道发生了什么。一旦你了解了保留计数,事情就会顺利得多。
    • 另外,+dictionaryWithObjects: 调用 -initWithObjects: 并在返回之前自动释放结果实例。
    • cobbal:不完全是,与该解决方案一样,该对象的保留计数为 2:一个来自其创建,将在自动释放到期时减去,另一个来自您的显式保持。 (这就是新的 Cocoa 程序员们为什么不应该关心 retainCount 的原因——它确实告诉你有多少对象拥有该对象!)
    【解决方案2】:

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

    首先,Objective-C 中没有堆栈对象之类的东西。所有对象都存在于堆上,如前所述,一种形式是“自动释放”。

    另外,您可能会直接设置实例变量,绕过来自@synthesize'd 访问器和修改器的内存管理。而不是这个:

    myMutableDict = [NSMutableDictionary dictionaryWithObjects:...];
    

    你应该说

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 2013-05-08
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多