2009-06-14 73 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(或其中一個同伴),內存管理錯誤通常是問題。