2010-07-22 2 views
0

Хорошо, поэтому я получил это событие, называемое clas.Ошибка при выпуске 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; 
} 

при настройке моего Tableview клетки я сделать:

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 в методе конфигурации ячейки вместо этого, и DonT даты выпуска 1 и 2 Даты оно работ.

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

ответ

1

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

2

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

Cocoa Memory Management Rules

You take ownership of an object if you create it using a method whose name begins with “alloc” or “new” or contains “copy” (for example, alloc, newObject, or mutableCopy), or if you send it a retain message. You are responsible for relinquishing ownership of objects you own using release or autorelease. Any other time you receive an object, you must not release it.

+0

Спасибо, ребята! Я чувствую себя глупо. Должен был это видеть. скопировал код и изменил его. Я не уверен, почему я получаю 0 назад при удалении релизов. Я думаю, что я сохраняю значение NSDate .. Я проверю, когда вернусь домой. – LarsJK

+0

Это сложно concept :) – willcodejavaforfood

+0

Причина, по которой метод возвращал 0, состоял в том, что [год преобразования] возвращает NSInteger. Я изменил свой двойник на NSIntegers, и он отлично работал! – LarsJK

Смежные вопросы