1

我有很多关于 NSDate 对象被过早释放的问题。我怀疑这些问题可能与我处理从 NSDate 便捷方法返回的对象的方式有关。我认为我在 JKShow 类中的 showDate 属性声明应该是“保留”,但是将其更改为分配或复制似乎对问题没有影响。

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便捷方法返回的日期。谢谢大家的帮助。

4

4 回答 4

2

从 dateFromComponents 返回的日期应该在自动释放池中,所以你的 showDate 属性应该是“保留”是正确的。事实上它应该是无论如何(除非你特别想要“复制”)。

从您显示的代码看来,您将 show 对象的所有权完全授予列表(因为您在添加它们时设置了自动释放)。您是说日期对象在显示对象从列表中出来之前被释放(或者列表被释放)?

另外,您是使用合成属性,还是手动编写它们?如果是后者,你的 setShowDate 属性方法是什么样的?

你也可以尝试在不同的地方记录日期对象的retainCount(尽管我总是发现自动释放确实使这复杂化)。

于 2008-11-01T18:03:48.213 回答
2

如果 showDate 是一个足够的保留属性,则考虑到您发布的代码。其他东西(可能在 JKShow 的实现中)可能不正确。

如果你想弄清楚发生了什么,你可以使用 Instruments 来检查对象的寿命。您需要使用分配工具集运行它以记住保留和释放。如果您运行泄漏性能工具,默认情况下会以这种方式设置。

当你像这样运行 Instruments 时,它会记录所有对象的生命周期,以及针对它们发出的每个保留和释放的回溯。如果您查看对象,找到您的日期之一,并查看所有保留和释放,您应该能够确定虚假释放发生的位置。

于 2008-11-01T18:10:26.140 回答
0

您显示的代码没有过早发布问题。事实上,它会泄漏数组和其中的所有内容,因为它不会释放数组。

您是否在打开垃圾收集器的情况下运行?

list实例变量还是静态变量,还是局部变量?

于 2008-11-01T18:35:35.433 回答
0

我想通了,感谢您的所有帮助,但问题出在我在这里发布的代码之外。我没有保留NSDate在我的 init 方法中创建的内容。不幸的是,直到我创建了两个新NSDate对象之后才发生崩溃,所以我完全是在找错树。

于 2008-11-01T19:21:09.850 回答