В заголовке вопроса написано «утечка памяти». Все в вопросе указывает на «сбой». Это сбой, а не утечка памяти. Или, по крайней мере, вы не будете знать, есть ли у вас утечка памяти или нет, пока вы не исправите ошибки.
Наиболее вероятным источником сбоя является неправильное управление переменной экземпляра listOfIntervals.
listOfIntervals = [NSMutableArray arrayWithArray: (NSMutableArray*)sourceArray];
В частности, это должно быть:
listOfIntervals = [[NSMutableArray arrayWithArray: sourceArray] retain];
Как указывал Майк выше, передача ссылки на изменяемую коллекцию, вероятно, плохая идея. Что произойдет, если sourceArray
изменится из-под вашего класса? Вы готовы с этим справиться?
Более распространенная идиома - объявить ваш метод как NSArray *, а затем скопировать массив:
listOfIntervals = [sourceArray mutableCopy]; // or -copy, if you don't need it to be mutable
(1) Приведение (NSMutableArray*)
было ненужным. Знал ли вред, но зачем, если он не нужен?
(2) Вам необходимо сохранить listOfIntervals. + arrayWithArray: создаст автоматически выпущенный массив и, таким образом, массив был released
после инициализации объекта, что приведет к аварийному завершению, которое вы видите.
(3) -copy & -mutableCopy возвращает сохраненные объекты, нет необходимости вызывать -retain.
Однако вам также необходимо исправить ваш -dealloc
метод:
- (void)dealloc {
// move this [super dealloc];
[listOfIntervals release];
[currentValue release];
[title release];
[super dealloc]; // to here
}
[super dealloc]
всегда должно быть последним . В -dealloc нет ничего волшебного, и, таким образом, имея этот вызов сначала, вы приказали экземпляру освободить себя , а затем , пройдя и очистив переменные экземпляра. Это привело бы ко второму сбою (или неожиданному поведению).
В целом, я бы посоветовал вам перечитать рекомендации по управлению памятью.
http://developer.apple.com/iPhone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html