NSDictionary 保留崩溃
Posted
技术标签:
【中文标题】NSDictionary 保留崩溃【英文标题】:NSDictionary retain crash 【发布时间】:2012-09-14 15:30:52 【问题描述】:我有一个 NSDictionary,通过解析存储值。我在-viewDidLoad
中分配和存储价值。并访问-viewWillAppear
中的值。它工作得很好。
然后,我有UIPageControl
和UIScrollView
。在滚动UIScrollView
时,我再次访问同一个字典,它崩溃说
[CFString respondToSelector:]: send to deallocated....
- (void) viewDidLoad
[super viewDidLoad];
scoresDict = [[NSDictionary alloc] initWithDictionary:[scoreObj scores]];
- (void)loadScrollViewWithPage:(int)page
if (page < 0)
return;
if (page >= kNumberOfPages)
return;
NSLog(@“scoresDict %@”,scoresDict);
我尝试在同一个函数中使用retain
,但没有成功。而copy
,它也不起作用。任何帮助,将不胜感激。谢谢!
【问题讨论】:
谁在保留 scoreObj,你在哪里发布它? scoreObj 是完成解析的类的子对象。在-viewDidLoad
初始化,在-dealloc
发布
【参考方案1】:
您没有这么说,但看起来所有这些方法都是从您的自定义 UIViewController 或 UIScrollViewController 子类的实例调用的。
最可能的问题是该实例本身没有被保留。
当您第一次从 nib 加载视图时,-viewDidLoad 和 -viewWillAppear 都会被调用。但是,垃圾收集可能发生在这些调用和您对 -loadScrollViewWithPage 的调用之间,并且没有对象与视图控制器实例本身有任何连接。
如果是这种情况,在 scoreDict 上使用复制或保留将无法解决问题。您需要确保复制或保留视图控制器实例本身。找出需要保留视图控制器的对象并确保它被保留。
测试这是否是问题的快速方法:在您的应用程序委托中创建一个“myViewController”属性。在 viewDidLoad 中,添加一行:
[[[UIApplication sharedApplication] delegate] setMyViewController:self];
如果这解决了您的问题,则意味着问题在于视图控制器被释放。但这并不意味着这是您的最佳解决方案,但这只是一种诊断。你需要弄清楚什么应该保留你的视图控制器并确保它这样做。
【讨论】:
我刚刚想到的一个注释:由于内存不足,您的 UIViewController 也可能被释放 - 在这种情况下,您需要实现 viewWillUnload 以将值保存在其他地方(或者只是重新jig 你的代码,所以它首先保存在其他地方)。但根据您的症状,上述情况似乎更有可能。以上是关于NSDictionary 保留崩溃的主要内容,如果未能解决你的问题,请参考以下文章
从 NSDictionary 转换为 [String:Any?]
带有 JSON 格式字符串的文件,如何将文件内容读入 NSDictionary
NSDictionary allKeys 崩溃 - 无法理解崩溃报告情况
当我创建一个整数作为对象的 NSDictionary 时应用程序崩溃