Ошибка при выпуске NSdate из [компонентов NSDateComponents: fromDate: toDate: options:]

Итак, я получил этот класс, называемый событием.

У него есть свойство, называемое eventDate, которое является NSDate. Я сделал метод, чтобы вернуть, сколько лет прошло с даты события:

- (double)yearsSinceEvent {
    double years;

    // Get the system calendar
    NSCalendar *sysCalendar = [NSCalendar currentCalendar];

    // Create the NSDates
    NSDate *date1 = self.eventDate; 
    NSDate *date2 = [NSDate  date];


    // Get conversion to months, days, hours, minutes
    unsigned int unitFlags = NSYearCalendarUnit;

    NSDateComponents *conversionInfo = [sysCalendar components:unitFlags fromDate:date1  toDate:date2  options:0];

    years = [conversionInfo year];

    [date1 release];
    [date2 release];

    return years;
}

при настройке ячеек таблицы я делаю:

cell.textLabel.text = [[events objectAtIndex:indexPath.row] name];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%d year's ago", [events objectAtIndex:indexPath.row] yearsSinceEvent]];

Но это выдает эту ошибку:

*** __NSAutoreleaseFreedObject(): освобождение ранее освобожденного объекта (0x595bda0) игнорируется

Что я здесь делаю неправильно?

Если я не выпускаю дату1 и дату2, я не получаю ошибку, но метод возвращает 0..

Если вместо этого я сделаю код yearsSinceEvent в методе конфигурации ячейки и не выпущу дату 1 и дату 2, это сработает.

Как мне это сделать?


person LarsJK    schedule 22.07.2010    source источник


Ответы (2)


Вы не должны выпускать date1 и date2, потому что они уже выпущены автоматически. Убедитесь, что ваш eventDate ivar правильно объявлен как сохраненное свойство: он должен быть @property (nonatomic, retain) NSDate *eventDate;

person lucius    schedule 22.07.2010

Вы не должны освобождать date1 и date2 в этом случае.
date2 создается с помощью фабричного метода и будет автоматически выпущено.
date1 — это то, что вы читаете из другого свойства БЕЗ сохранения, поэтому вы не должны освобождать его или самостоятельно. .eventDate будет выпущен.

Правила управления памятью Cocoa

Вы становитесь владельцем объекта, если создаете его с помощью метода, имя которого начинается с «alloc» или «new» или содержит «copy» (например, alloc, newObject или mutableCopy), или если вы отправляете ему сообщение сохранения. Вы несете ответственность за отказ от владения объектами, которыми вы владеете, с помощью выпуска или автоматического выпуска. В любой другой раз, когда вы получаете объект, вы не должны его отпускать.

person willcodejavaforfood    schedule 22.07.2010
comment
Спасибо, парни! Я чувствую себя глупо. Должен был это увидеть. скопировал код и изменил его.. Я не уверен, почему я получаю 0 обратно при удалении релизов.. Я действительно думаю, что сохраняю значение NSDate.. Я проверю, когда вернусь домой.. - person LarsJK; 22.07.2010
comment
Причина, по которой метод вернул 0, заключалась в том, что [conversionInfo year] возвращает NSInteger. Я изменил свой двойник на NSIntegers, и это сработало отлично! - person LarsJK; 22.07.2010