处理从cocoa方法返回的对象

时间:2008-11-01 17:48:26

标签: cocoa nsdate autorelease convenience-methods

我有很多问题,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 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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