我对这个小应用程序感到疯狂...请帮助我!!!
这是应用程序的源代码:Smoking.zip
它仅保存带有 NSMutableArray 的 .dat 文件。 现在,第一次启动应用程序时,有时尝试单击香烟按钮:一切都应该正常工作。 好的,现在关闭应用程序,重新打开它,然后再次单击按钮。这次应用程序将崩溃,并出现“无法识别的选择器发送到实例 0x5d18d60”错误。 我确定问题在于保存数据,因为当我评论“[theData writeToFile:dataFilePathatomically:YES];”行时在“saveData”方法中错误消失了。 后来我发现如果我尝试从 NSMutableArray 读取数据,它会再次出现。
请花点时间检查我的项目并帮助我,因为我对此感到疯狂!!
最佳答案
你这个疯子,花了很长时间才找到这些行:
Cig *oldCig = [mainDelegate.smokeArray lastObject];
...
[oldCig release];
你为什么要这么做?您有效地将数组中最后一个对象的保留计数减少到 0。保存时,它很高兴地被保存,其保留计数为零。
在反序列化时,解码器将保留它解码的任何(子)元素,因此最后一个对象的保留计数将短暂地为 1。然后,在释放解码器时,它会释放所有元素,然后 poof 进入最后一个 Cig 对象。当从数组中获取该对象时,您会得到一个指向完全不同的东西的指针,并且应用程序崩溃了。
您应该阅读有关内存处理的内容。 lastObject
只是返回一个指向数组中对象的指针,不会为您保留它,因此您不必释放它。此外,对于像
- (NSArray *) quando
尝试通过在返回之前调用 autorelease 来返回一个自动释放的数组:
NSArray *newArray = [[[NSArray alloc] initWithObjects:year,...,nil] autorelease];
那么你的其他代码就不必考虑释放它。并释放dateFormatter。您分配
、保留
、复制
或新建
的任何内容,都必须释放
或自动释放
!
关于iphone - 无法识别的选择器发送到实例 0x5d18d60...我要疯了!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3436007/