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

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

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

其他提示

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

从您显示的代码看起来,您将show对象的所有权完全归属于列表(因为您在添加它们时设置自动释放)。您是说在显示对象从列表中出来之前是否已取消分配日期对象(或者列表正在被释放)?

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

你也可以尝试在不同的地方记录日期对象的retainCount(虽然我总觉得autorelease真的很复杂)。

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

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

当您运行这样的仪器时,它将记录所有对象寿命,以及针对它们发出的每个保留和释放的回溯。如果您查看对象,找到一个日期,并查看所有保留和版本,您应该能够确定虚假发布的位置。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top