Когда сохраненное имущество освобождается? - PullRequest
0 голосов
/ 25 января 2012

У меня есть свойство, подобное этому:

@property(nonatomic,retain) NSString *porpertyList;

@synthesize porpertyList = _porpertyList;

- (void)dealloc
{
[_porpertyList release];
}

И если я сделаю это _porpertyList = @ ""; в моем приложении. Собственность освобождена?

// Edited Теперь я не понимаю, когда мне следует использовать этот @synthesize porpertyList = _porpertyList; ?

Ответы [ 5 ]

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

Если вы обращаетесь к такому свойству

self.property=@"";

, вы фактически используете метод установки (который создается автоматически благодаря @synthesize).Таким образом, в этом случае старый объект освобождается, а новый назначается и сохраняется.

Если вы синтезировали свое свойство, используя

@synthesize property= _property;

, то если вы вызовете

_property=@"";

тогда вы просто назначаете новое значение свойству.Тогда ничего не высвобождается.

Итак, в вашем методе dealloc есть несколько вариантов:

-(void)dealloc
{
   self.property=@"";//old value released, new value is @""
   self.property=nil;//old value released, new value is nil
   [_property release]; //old value released
   [super dealloc];
}
2 голосов
/ 25 января 2012

Зависит от того, какую модель памяти вы используете. Если вы используете ARC, вам не нужно писать dealloc для освобождения сохраненных свойств, это сделано для вас. Если вы не используете ARC, вы хотите освободить переменные для сохраненных свойств:

- (void) dealloc {
    [_propertyList release];
    [super dealloc];
}

Здесь следует отметить две вещи:

  1. Вы хотите освободить переменную здесь, а не установить для свойства значение nil. Это позволяет избежать побочных эффектов, которые могут возникнуть при использовании сеттеров (пользовательское поведение, уведомления kvo).
  2. Не забудьте позвонить [super dealloc];
1 голос
/ 25 января 2012
@synthesize porpertyList = _porpertyList;

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

Using self.propertyList = something

и

 porpertyList = something 

очень разные вещи, и последнего следует избегать при использовании свойств. Вот почему porpertyList = _porpertyList; есть ... так что вы не используете propertyList вместо self.porpertyList

Причина в том, что .. , что popertyList является указателем ..

когда вы делаете self.porperty = something ... вы делаете отдельную копию этого объекта для себя (не в случае @ "") но если вы делаете popertyList = что-то .. вы делаете его указателем на другой объект, таким образом связываясь со всем начальным счетом сохранения, который может заставить вашу программу вести себя странно ..

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

_porpertyList = @"" не выпустит ничего. Если вы хотите выпустить, вы можете использовать self. porpertyList = nil. Это освободит это должным образом.

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

если вы используете опцию @property для имени переменной, вы должны присвоить ей, используя self.propertyList = @"" вместо _propertyList = @"".использование self.propertyList освободит всю предыдущую память, которая использовалась при назначении ему

...