【问题标题】:Why is my dictionary released in a NSArray?为什么我的字典在 NSArray 中发布?
【发布时间】:2011-11-24 18:24:10
【问题描述】:

我有一个 tableviewcontroller,它将字典对象存储在一个数组中,当一行被选中时,我在导航堆栈上推送一个新的视图控制器,并在它的初始化程序中从数组中传递一个字典对象,字典对象将被保留在新视图控制器的属性中。当我返回到我的 tableviewcontroller 时,我在视图控制器的 dealloc 中释放字典对象。但是当我在 tableviewcontroller 中向下/向后滚动时,传递给视图控制器的字典在 tableviewcontroller 的数组中被释放,程序崩溃并显示以下消息:

BreakdanceSource[1351:607] * 由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[valueForUndefinedKey:]:此类不符合键标题的键值编码。”

当我从视图控制器的 dealloc 函数中删除 [dictionary release] 时,程序可以运行并且不会崩溃!这很奇怪,因为我认为数组还保留了它的对象的所有权,所以字典不应该被释放。

为什么我不能在视图控制器中释放字典对象? (我现在已经在 dealloc 中删除了 [dictionary release] 并且程序可以运行,但我不会有内存泄漏吗?)

到目前为止我已经尝试过了!:

imageshack.us/photo/my-images/813/screenshot20110926at610.png 我使用了僵尸工具,这就是我的结果!我没有得到的是,在我的视图控制器的 dealloc 之前,保留计数是 1,应该是 2。因为 tableviewcontroller 中的数组应该拥有字典,并且我的视图控制器中有一个属性是 @属性(保留)NSDictionary* 媒体。我不知道我的字典在哪里被释放,因为现在它只在视图控制器的 dealloc 中被释放

我还尝试将属性 @property (retain) 更改为 @property NSDictionary* media 然后我使用 media = [infoDictionary retain] 并且它不会崩溃.. 我的属性 (retain) 没有保留它吗?

【问题讨论】:

  • 您使用什么函数从数组中获取条目?例如,如果它是 removeObjectAtIndes 与 objectAtIndex,那么您显然会从数组中删除字典。但更有可能的是,您只是在以某种方式进行双重发布。
  • 我正在使用 [media objectAtIndex:indexPath.row];所以数组不应该释放这个东西!

标签: objective-c ios memory-management dictionary


【解决方案1】:

是的NSMutableArray 增加添加到其中的对象的保留计数,并在释放NSMutableArray 时相应地减少保留计数。这并不能阻止其他东西将保留计数减少到对象释放点。所以,必须有另一个对象的释放/自动释放。

使用 Instruments Allocation 工具,设置保留计数选项,找到对象,您将看到额外释放发生在哪里。有关以这种方式使用 Instruments 的信息,请参阅 this SO answer

【讨论】:

  • imageshack.us/photo/my-images/813/screenshot20110926at610.png 我使用了僵尸工具,这就是我的结果!我没有得到的是,在我的视图控制器的 dealloc 之前,保留计数是 1,应该是 2。因为 tableviewcontroller 中的数组应该拥有字典,我的视图控制器中有一个属性是 @属性(保留)NSDictionary* 媒体。我不知道我的字典在哪里被释放,因为现在它只在视图控制器的 dealloc 中被释放。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多