Вопрос

У меня есть следующий код ниже, который предназначен для изменения переменной класса под названием «сегодня» вперед или назад на один день.Один раз сработает, но потом вылетит.Он будет делать то же самое независимо от того, нажму ли я левую или правую кнопку.Что я делаю не так?

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];

перед вызовом [super Dealloc];

Другие советы

Вам необходимо прочитать документацию по управлению памятью.Это здесь:

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 (или один из его компаньонов).

Может быть, тебе нужно сказать

today = [[NSDate date] retain]

Я думаю, вам нужно сохранить объект newDay, возвращаемый методом addTimeInterval.Возможно, вам также придется отпустить сегодня, прежде чем вы выполните задание в конце.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top