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

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

0 голосов
/ 01 июня 2011

У меня есть этот код:

в 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'

Ответы [ 3 ]

3 голосов
/ 01 июня 2011

В 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] in addDay.

Кроме того, не забудьте установить в своем деструкторе self.dateForView = nil, чтобы избежать утечки памяти.

0 голосов
/ 01 июня 2011

Я выполнил ваш код

вы должны изменить эту строку: -

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

}
0 голосов
/ 01 июня 2011

Может быть dateForView выпущен.Для решения этой проблемы используйте [dateForView retain];в ibaction. Но это увеличит память

...