Перво-наперво: вы должны переместить вызов [super dealloc]
в конец вашего dealloc
метода. Сначала обработайте свои пользовательские переменные, а затем последнее, что вы делаете, это подталкиваете dealloc
к суперклассу для обработки остальной части очистки.
Теперь я беспокоюсь о [sortedArray release]
и [sortedArray retain]
там. Чтобы сохранить семантику реализации retain
/ release
на вашем sortedArray
ivar, вы должны объявить свойство для sortedArray
следующим образом:
// this goes in your @interface
@property (nonatomic, retain) NSArray *sortedArray;
// this goes in your @implementation
@synthesize sortedArray;
Теперь вы можете легко установить sortedArray
, не беспокоясь о сохранении или отпускании:
// note the use of self, this is required
self.sortedArray = [exerciseArray sortedArrayUsingDescriptors:sortDescriptors];
Теперь вы можете удалить вызовы release
и retain
, поскольку они обрабатываются автоматически. Обязательно добавьте строку в ваш метод dealloc
, чтобы очистить переменную тоже.
self.sortedArray = nil;
.. который вызовет release
для вашего массива.
РЕДАКТИРОВАТЬ: Это также относится к упражнению ArrayArray, который был вашим реальным вопросом. Везде, где задействован класс Cocoa, вы можете упростить управление памятью, используя @property (retain)
и @synthesize
. Для NSInteger
и других примитивных типов, или если вы не хотите хранить ссылку на объект, принадлежащую ему, используйте @property (assign)
.