Вы сумасшедший, потребовалось довольно много времени, чтобы найти эти строки:
Cig *oldCig = [mainDelegate.smokeArray lastObject];
...
[oldCig release];
Почему вы это делаете?Вы эффективно уменьшаете счетчик сохранности последнего объекта в массиве до 0. При сохранении он успешно сохраняется с нулевым счетом хранения.
При десериализации декодер сохранит любой (под)элемент, который он декодирует, так что счетчик сохранности этого последнего объекта будет на короткое время равным 1. Затем, при освобождении декодера, он освобождает все элементы, и poof переходит к последнему объекту Cig.При получении этого объекта из массива вы получаете указатель, указывающий на что-то совершенно другое, и приложение вылетает.
Вы должны прочитать об обработке памяти.lastObject
просто возвращает указатель на объект в массиве, не сохраняя его для вас, поэтому вам не нужно его освобождать.Кроме того, для таких функций, как
- (NSArray *) quando
, попробуйте вернуть автоматически выпущенный массив, вызвав autorelease перед возвратом:
NSArray *newArray = [[[NSArray alloc] initWithObjects:year,...,nil] autorelease];
Тогда ваш другой код не должен думать о его освобождении.И выпустить dateFormatter.Все, что вы alloc
, retain
, copy
или new
, вы должны release
или autorelease
!