Ошибка при освобождении NSdate из [NSDateComponents компонентов: fromDate: toDate: options:] - PullRequest
0 голосов
/ 22 июля 2010

Хорошо, я получил этот класс под названием событие.

У него есть свойство с именем 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) игнорируется

Что я здесь не так делаю?

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

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

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

Ответы [ 2 ]

2 голосов
/ 22 июля 2010

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

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

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

1 голос
/ 22 июля 2010

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

...