Что произойдет, если мы сделаем выделенный указатель на объект как nil? - PullRequest
0 голосов
/ 23 января 2012

Я видел этот код в нескольких местах.

XYZ *xyz = [[XYZ alloc] init];

, но в dealloc вместо [xyz release];

люди использовали self.xyz = nil;

Не приведет ли это к утечке памяти?

РЕДАКТИРОВАТЬ: Это был не xyz = nil, как я писал изначально, это было self.xyz = nil, Это была собственность.

Ответы [ 3 ]

3 голосов
/ 23 января 2012

да, это утечка памяти, однако, если XYZ объявлен как свойство, например

@property (nonatomic, retain) XYZ* xyz;

- (void)dealloc
{
    self.xyz = nil;
    [super dealloc];
}

это не утечка памяти, может быть те, что вы видели, были на самом деле?

Edit: тогда это не утечка памяти, причина в том, что сеттер создается свойством, это будет что-то похожее на приведенное ниже

- (void)setXYZ:(XYZ *)newXyz
{
    [xyz release];
    xyz = [newXyz retain];
}

, поскольку newXyz равен nil, отправка сохранения в nil ничего не делает, в то время как установщик освобождает старый xyz. В этом случае память управляется должным образом

2 голосов
/ 23 января 2012

Это зависит от настроек проекта.Если ARC включен, то нет, проблем быть не должно.Однако если в проекте не включена поддержка ARC, могут возникнуть проблемы с утечкой памяти.

0 голосов
/ 23 января 2012

Вы можете сделать это только для сохраненных свойств и с помощью установщика (self.propertyToBeReleased=nil или [self setProPropertyToBeReleased:nil) Таким образом, если вы присваиваете свойство nil, старое освобождается, а указатель указывает на nil.

Вы не должны делать это с iVars. Поскольку данные просто просачиваются (данные не освобождаются, но на них нет указателей -> больше не могут быть освобождены).

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