Ваш код имеет несколько проблем.Во-первых, вы не делаете ни copy
, ни retain
строку, сохраненную в переменной экземпляра name
.Таким образом, если строка освобождается тем, кто сохранил ее в свойстве, у вас останется свисающая ссылка.Вы должны сделать
- (void) setName: (NSString*) aName {
if( name != aName ) {
if( name ) [name release];
name = [aName retain]; // or copy
}
}
или использовать свойства с самого начала.
Кроме того, если вы храните ссылки на объекты в переменных экземпляра, вы должны предоставить правильное определение метода dealloc
:
- (void) dealloc {
self.name = nil;
[super dealloc];
}
Наконец, только то, что объект был освобожден, не означает, что память предыдущего экземпляра признана недействительной.Ваша исходная программа, скорее всего, вызывает метод по висячей ссылке (var
), который здесь работает просто благодаря удаче.(В частности, для (auto
) release
автоматически не устанавливается ссылка на nil
).