Почему у меня нет утечки памяти с [anObject release], а у меня проблемы с self.anObject = nil? - PullRequest
0 голосов
/ 27 ноября 2011

Я скопировал этот пример из этой темы. Лучше выпустить ивару напрямую.

Лучше выпустить ивару напрямую.Если подкласс переопределяет методы установки свойства, ваш объект может утечь, потому что ваш метод не вызывается.

@interface ClassA
@property (readwrite, retain) id anObject;
@end

@interface ClassB : ClassA
@end

@implementation ClassA
@synthesize anObject;

- (void)dealloc {
self.anObject = nil;

[super dealloc];
}
@end

@implementation ClassB
- (void)setAnObject: (id)anObject {
// do nothing!
}
@end

Я не вижу никакой разницы между [anObject release] и self.anObject= нольПотому что

self.anObject = nil

равно

[anObject release];
anObject=nil;

Почему у меня нет утечки памяти с [anObject release]?

Ответы [ 2 ]

4 голосов
/ 27 ноября 2011

Поскольку

self.anObject = nil

равно

[anObject release];

anObject=nil;

Это неверно и является источником вашего замешательства.

self.anObject = nil не НЕ переводится в прямой доступ к ивару. Вместо этого оно становится

[self setAnObject:nil];

И поскольку вы переопределили метод -setAnObject:, чтобы ничего не делать, базовая переменная экземпляра никогда не освобождается, и, таким образом, вы теряете память.

Между прочим, это точно , поэтому вам следует избегать использования методов установки внутри ваших методов init и dealloc. Подклассы могут переопределять их, чтобы делать нестандартные вещи.

1 голос
/ 27 ноября 2011

Если вы говорите об объекте класса B, то ваш сеттер вообще ничего не делает. Таким образом, он не освобождает объект, поэтому у вас есть утечка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...