NSDate Проблема - PullRequest
       17

NSDate Проблема

3 голосов
/ 14 июня 2009

Ниже приведен следующий код, предназначенный для изменения класса var с именем "today" вперед или назад на один день. Это будет работать один раз, но потом это вылетает. Это будет делать то же самое независимо от того, нажму ли я левую или правую кнопку. Что я делаю не так?

var сегодня - это класс var, инициированный как .. today = [NSDate date]

Вот метод, который дает сбой:

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

}

Ответы [ 4 ]

9 голосов
/ 14 июня 2009

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

При инициализации экземпляра используйте:

today = [[NSDate date] retain];

Я бы изменил последнюю строку на:

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

И, наконец, в вашем методе dealloc добавьте:

[today release];

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

2 голосов
/ 14 июня 2009

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

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

1 голос
/ 14 июня 2009

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

1 голос
/ 14 июня 2009

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

today = [[NSDate date] retain]
...