#iphone #objective-c #xcode #ios #nsdate
#iPhone #objective-c #xcode #iOS #nsdate
Вопрос:
У меня есть этот код:
в viewDidLoad
:
dateForView = [[NSDate alloc] init]; (dateForView is a NSDate)
и IBAction:
- (IBAction) addDay{
NSLog(@"dateforview1:%@", dateForView);
dateForView = [dateForView dateByAddingTimeInterval:60*60*24*1];
NSDateFormatter *formatter =[[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"dd/MM/yyyy"];
[dataLabel setText:[formatter stringFromDate:dateForView]];
}
Когда я нажимаю кнопку, подключенную к этому IBAction, в первый раз все в порядке, но в следующий раз происходит сбой. Это результат сбоя в консоли:
2011-06-01 11:29:55.238 Prenotazioni[554:707] dateforview1:(
"<UIControlTargetAction: 0x1962d0>"
)
2011-06-01 11:29:55.246 Project[554:707] -[__NSArrayI dateByAddingTimeInterval:]: unrecognized selector sent to instance 0x1ba680
2011-06-01 11:29:55.264 Project[554:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI dateByAddingTimeInterval:]: unrecognized selector sent to instance 0x1ba680'
Комментарии:
1. Один вопрос, который следует рассмотреть, не связанный с вашей проблемой. Простое добавление 86 400 секунд к дате может быть неправильным решением для добавления одного дня, поскольку оно не учитывает изменения летнего времени. Вероятно, вам следует использовать NSDateComponents developer.apple.com/library/mac/documentation/Cocoa/Conceptual /…
2. Я знаю nsdatecomponent, но после у меня может возникнуть проблема с сравнением с NSDate
3. Вы прочитали предоставленную мной ссылку? Вы создаете NSDateComponent, представляющий один день, а затем добавляете его в
dateForView
usingNSCalendar
.dateForView
остаетсяNSDate
.
Ответ №1:
В viewDidLoad
вы получаете файл, NSDate
на который у вас есть ссылка (поскольку вы создали его с помощью init
). При первом запуске addDay
вы заменяете это на автоматически выпущенное, NSDate
для которого у вас больше нет ссылки. При выходе addDay
эта ссылка на dateForView
становится недействительной, и при следующем вводе addDay
и попытке увеличить ее значение произойдет сбой вашего приложения. Решение заключается в:
- Создайте
dateForView
свойство сretain
политикой, - Используйте
self.dateForView = [NSDate date]
вviewDidLoad
. - Используйте
self.dateForView = [self.dateForView dateByAddingTimeInterval:60*60*24*1]
вaddDay
.
Кроме того, не забудьте установить self.dateForView = nil
в своем деструкторе, чтобы избежать утечки памяти.
Комментарии:
1. self.dateForView = ноль? или [выпуск dateforView] в dealloc, нет?
2. Подойдет любой из них; Я обычно использую
self.dateForView = nil
, когда у меня есть свойство, соответствующее переменной экземпляра.3. Вам не следует использовать свойства в dealloc, если вы можете их избежать. Освободите переменную экземпляра, если она явно объявлена.
Ответ №2:
Возможно, dateForView выпущен. Для решения этой проблемы используйте [dateForView retain]; в ibaction.Но это увеличит объем памяти
Комментарии:
1. Вы также должны освободить предыдущее
dateForView
значение вaddDay
, если вы решите это сделать, иначе приложение потеряет память.
Ответ №3:
Я выполнил ваш код
вы должны изменить эту строку:-
NSDateFormatter *formatter =[[[NSDateFormatter alloc] init] autorelease];
to
NSDateFormatter *formatter =[[NSDateFormatter alloc] init];
and at last
[formatter release];
like:-
- (IBAction) addDay{
NSLog(@"dateforview1:%@", dateForView);
dateForView = [dateForView dateByAddingTimeInterval:60*60*24*1];
NSDateFormatter *formatter =[[NSDateFormatter alloc] init];
[formatter setDateFormat:@"dd/MM/yyyy"];
[dataLabel setText:[formatter stringFromDate:dateForView]];
[formatter release];
}
Комментарии:
1. @blackguardian выполните код один раз, потому что я не получаю никакого сбоя, и еще вопрос, используете ли вы dateForView где-нибудь еще в своем контроллере просмотра.