【发布时间】: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