Вместо отправки -release
объекту, возвращенному методом метода доступа к свойству, установите для самого свойства значение nil
:
- (void)dealloc {
self.recorder = nil;
[super dealloc];
}
Компилятор будет знать, как поступить правильно, потому что вы указали семантику хранилища в объявлении свойства. Синтезирование свойства, объявленного с семантикой retain
, фактически эквивалентно написанию следующих методов доступа:
- (AVAudioRecorder *)recorder {
return recorder;
}
- (void)setRecorder:(AVAudioRecorder *)newRecorder {
[newRecorder retain];
[recorder release];
recorder = newRecorder;
}
Когда вы пишете self.recorder = nil
, компилятор переводит его в [self setRecorder:nil]
. Таким образом, установка свойства на nil
позволяет избежать как утечек памяти, так и висячих указателей, включает в себя меньшее количество шаблонов с вашей стороны и более четко выражает намерение кода.
Наконец, никогда не помешает перечитать Язык программирования Objective-C , в котором есть раздел по объявленным свойствам; и Расширенное руководство по программированию управления памятью , в котором подробно рассматриваются все различные подходы к управлению памятью.