由于NSDate对象过早地被释放,我遇到了很多问题。我怀疑这些问题可能与我处理从NSDate方便方法返回的对象的方式有关。我认为我在showDate类中的JKShow属性声明应该“保留”,但将其更改为赋值或复制似乎对此问题没有任何影响。
JKShow *show;
NSDate *date;
NSMutableArray *list = [[NSMutableArray alloc] init];
// Show 1
show = [[JKShow alloc] init];
//...
date = [gregorian dateFromComponents:dateComponents];
show.showDate = date;
[list addObject:[show autorelease]];
// Show 2
show = [[JKShow alloc] init];
//...
date = [gregorian dateFromComponents:dateComponents];
show.showDate = date;
[list addObject:[show autorelease]];
更新
问题不在这里复制的代码中。在我的JKShow init
方法中,我没有保留从NSDate
方便方法返回的日期。谢谢你们的帮助,各位。
发布于 2008-11-01 11:21:09
我想明白了,谢谢你的帮助,但问题不在我在这里发布的代码之外。我没有保留我在init方法中创建的NSDate
。不幸的是,直到我创建了两个新的NSDate
对象之后,才发生了崩溃,所以我完全搞错了。
发布于 2008-11-01 10:03:48
从dateFromComponents返回的日期应该在自动释放池中,因此您的showDate属性应该“保留”是正确的。事实上,它应该是无论如何(除非你特别想要“复制”)。
从您已经显示的代码来看,它看起来像是将显示对象的所有权完全交给了列表(当您添加它们时,您正在设置它们的自动发布)。您是说在显示对象从列表中出来(或者列表正在被取消分配)之前,日期对象正在被解除分配吗?
此外,您是使用综合属性,还是手工编写这些属性?如果是后者,您的setShowDate属性方法是什么样的?
您也可以尝试在不同的位置记录date对象的retainCount (尽管我总是发现自动发布确实使这件事复杂化了)。
发布于 2008-11-01 10:10:26
如果showDate是一个保留属性,那么根据您发布的代码,该属性应该足够了。其他的东西(可能在JKShow的实现中)可能不正确。
如果您想知道发生了什么,您可以使用仪器来查看对象的寿命。您需要使用配置工具来运行它,以便记住、保留和发布。默认情况下,如果运行泄漏性能工具,就会以这种方式设置它。
当您运行像这样的工具时,它将记录所有对象的生命周期,以及针对它们发出的每一个保留和发布的回溯。如果您查看对象,找到您的日期之一,并查看所有保留和释放,您应该能够确定虚假发布发生在哪里。
https://stackoverflow.com/questions/255846
复制相似问题