質問
私はその下に次のコードは、1日で前方または後方に「今日」と呼ばれるクラスのVARを変更することを意図している必要があります。これは、1時間に動作しますが、その後、それがクラッシュします。私は左ボタンまたは右ボタンを押したかどうかは関係なく、同じことを行いません。私が間違って何をしているのですか?
のvar今日はクラスvarはとして開始された。..今日= [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;
}
解決
あなたが作成した日付を保持する必要がないだけでなく、あなたもそうでない場合は、古い参照をリークします「本日」が保持している既存の値を解放する必要があります。
インスタンスを初期化するときは、使用します:
today = [[NSDate date] retain];
私はへの最後の行を変更します
[today release];
today = [newDay retain];
そして最後に、あなたのdeallocメソッドでは、追加します:
[today release];
[スーパーのdealloc]を呼び出す前に、
他のヒント
あなたは、メモリ管理のマニュアルを読む必要があります。それがここにあります:
あなたが追加または日数を減算している場合は、同じことをやって別の方法をしている、これを参照することもできます。
<のhref = "http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html#//apple_ref/doc/uid/TP40007836-SW1" のrel = "nofollowをnoreferrer"> http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html#//apple_ref/doc/uid/TP40007836-SW1する
何かがクラッシュした場合、最後に、それはバックトレースを見て(そしてあなた自身のためにそれを把握することはできません場合は、あなたの質問に含める)と便利です。あなたがトレースにobjc_msgSend(あるいはその仲間の1)を参照してください場合は、メモリ管理のバグは、通常は問題あります。
たぶん、あなたが言う必要がある。
today = [[NSDate date] retain]
私はあなたがaddTimeIntervalメソッドから返さnewDayオブジェクトを保持する必要があると思います。また、あなたが最後に割り当てを行う前に、今日解放する必要があります。