iOS: проблема с датой

#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 using NSCalendar . dateForView остается NSDate .

Ответ №1:

В viewDidLoad вы получаете файл, NSDate на который у вас есть ссылка (поскольку вы создали его с помощью init ). При первом запуске addDay вы заменяете это на автоматически выпущенное, NSDate для которого у вас больше нет ссылки. При выходе addDay эта ссылка на dateForView становится недействительной, и при следующем вводе addDay и попытке увеличить ее значение произойдет сбой вашего приложения. Решение заключается в:

  1. Создайте dateForView свойство с retain политикой,
  2. Используйте self.dateForView = [NSDate date] в viewDidLoad .
  3. Используйте 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 где-нибудь еще в своем контроллере просмотра.