【发布时间】:2011-07-10 21:13:44
【问题描述】:
似乎我一直在问同样的问题,与记忆有关。我当前的代码完全按照我的预期工作,但我不知道为什么我在 Instruments 中显示了泄漏。
-(NSDate *)startTimeAndDate {
NSDate *dateToReturn = nil;
if (startTimeAndDate != nil) {
dateToReturn = [startTimeAndDate retain];
} else { //is currently nil, this will be the initial setting
//return default time if we have a working date
if (finishTimeAndDate != nil) {
dateToReturn = [[self dateFromDate:finishTimeAndDate withNewTime:defaultStartTime]retain];
} else {
//return the default time with today's date if we have nothing set as yet
dateToReturn = [[self dateFromDate:[NSDate date] withNewTime:defaultStartTime] retain];
}
//save the initial setting
self.initialStartDateAndTime = [[dateToReturn copy] autorelease];
}
[startTimeAndDate release];
startTimeAndDate = dateToReturn;
return startTimeAndDate;
}
-(void)setStartTimeAndDate:(NSDate *)inStartTimeAndDate {
BOOL initialAssignment = NO;
if (startTimeAndDate == nil) {
initialAssignment = YES;
}
if (startTimeAndDate != inStartTimeAndDate) { //skip everything if passed object is same as current
//check that the start time is prior to finish only if finish time has been entered
NSDate *dateToSetStartTo = nil;
if (finishTimeAndDate != nil) {
if ([inStartTimeAndDate earlierDate:finishTimeAndDate] == inStartTimeAndDate) {
// use the new time, it is earlier than current finish time
dateToSetStartTo = [inStartTimeAndDate retain];
} else { //start time is not earlier then finish time
// the received entry is invalid, set start time to 1 default interval from finish
dateToSetStartTo = [[finishTimeAndDate dateByAddingTimeInterval:-self.defaultTimeInterval] retain];
}
} else { //finish time is nil
// use the new time without testing, nothing else is set
dateToSetStartTo = [inStartTimeAndDate retain];
}
[startTimeAndDate release];
startTimeAndDate = dateToSetStartTo;
}
if (initialAssignment) {
self.initialStartDateAndTime = [[self.startTimeAndDate copy] autorelease];
}
}
据我所知,我正在平衡所有保留与release 或autorelease。泄漏似乎仅在第一次通过时引起。我有一个视图控制器,它创建我的模型(此代码所在的位置)并设置开始日期,此时没有做任何其他事情。如果我此时关闭该视图控制器,Instruments 会显示我将日期对象作为泄漏。
我放置了一个NSLog 以在dealloc 显示保留计数,果然,在调用我的最终版本之前它的保留计数为2,当它应该被销毁时保留计数为1。无论我是在初始化后立即关闭还是设置并获取一百次,它总是相同的。 retainCount 在我最后一次打电话给 release 之前是 2 dealloc。
我整个周末都在看这个,不知道我哪里出错了。
为了澄清,最初的调用是设置startTimeAndDate 属性。那时所有其他字段都为零,如果不是对象,则为 0。 startTimeAndDate 对象似乎是泄漏对象。
【问题讨论】:
-
请正确缩进您的代码,并告诉我们泄漏的位置。
-
如果不清楚,我深表歉意。到目前为止,我只发布了几次,格式对我来说是新的。据我在浏览器中可以看出,它看起来是正确缩进的。我相信泄漏是 NSDate 对象“startTimeAndDate”。
-
谢谢,现在好多了。出于某种原因,这里的代码块对标签很有趣——在发布时使用空格会更好。
-
您的代码中有异常多的保留。复制/自动释放的东西看起来不对。在您的 .h 文件中,您可以指定应保留的属性,这将消除此处显示的大部分代码。祝你好运。
-
我确实设置了要保留的属性,但是由于我同时覆盖了 getter 和 setter,我希望我必须从那里返回或创建一个保留的对象。我已经在没有它们的情况下尝试过,但我确实遇到了异常,调用了 dealloc'd 对象。
标签: objective-c ios cocoa-touch