2009-06-14 2 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] сохранить];', лучше было бы: 'today = [[NSDate alloc] init];', что избавляет его от необходимости делать авторекламу – user102008

1

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

today = [[NSDate date] retain] 
1

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

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

Смежные вопросы