2009-06-14 46 views
3

我有下面的代码,这是为了改变一个名为“今天”的类var前进或后退一天。它会工作一次,但之后它崩溃。无论按下左键还是右键,它都会执行相同操作。我究竟做错了什么?NSDate问题

今天

的变种是发起的。如今= [NSDate的日期]

这里一类变种是,崩溃的方法:

(IBAction)changeDateByOne:(id)sender{ 

NSDate *newDay; 
NSDate *currentDay = today; 

NSTimeInterval secondsPerDay = 24 * 60 * 60; 

if(sender == leftButton){ 
    newDay = [currentDay addTimeInterval:-secondsPerDay]; 

}else if(sender == rightButton) { 
    newDay = [currentDay addTimeInterval: secondsPerDay]; 


} 

today = newDay; 

}

回答

9

您不仅需要保留创建的日期,而且还需要释放“今天”保存的现有值,否则您会泄漏旧的参考。

当初始化实例,使用:

today = [[NSDate date] retain]; 

我会改变最后一行:

[today release]; 
today = [newDay retain]; 

最后,在你的dealloc方法,添加:

[today release]; 

在调用[super dealloc]之前;

+0

而不是`today = [[NSDate date] retain];`,最好是:`today = [[NSDate alloc] init];```````````````` – user102008 2011-04-19 21:52:00

1

也许你需要说

today = [[NSDate date] retain] 
1

我认为你需要保留从addTimeInterval返回的newDay对象HOD。您可能还需要在最后完成作业之前发布。

2

您需要阅读内存管理文档。这是在这里:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

如果你增加或减少天,你可能想读这是做同样的事情的另一种方式:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html#//apple_ref/doc/uid/TP40007836-SW1

最后,如果有些事情会崩溃,看后面的痕迹通常会很有帮助(如果你自己弄不清楚的话,将它们包含在你的问题中)。如果您在跟踪中看到objc_msgSend(或其中一个同伴),内存管理错误通常是问题。