iphone - 无法识别的选择器发送到实例 0x5d18d60...我要疯了!

标签 iphone cocoa xcode

我对这个小应用程序感到疯狂...请帮助我!!!

这是应用程序的源代码: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/

相关文章:

iphone - EGOTableViewPullRefresh - 模拟 viewDidLoad 上的下拉

objective-c - QTKit奇怪的错误

objective-c - 关于 NSString 的一些初学者问题

ios - 将自定义 UIView 渲染到 Storyboard

ios - 更新后保存的照片不会出现在设备上

iphone - 如何一起滚动一组 UIScrollView?

ios - 构建配置和目标之间有什么区别?

ios - iOS 中的相对路径

iphone - 数据模型中或 NSManagedObject 的自定义子类中定义的 transient 属性之间有区别吗?

cocoa - 如何在 Swift 中使用文件系统事件 API?