Каков наилучший способ освободить свойства target-c? - PullRequest
0 голосов
/ 19 марта 2010

Я новичок в управлении памятью и читаю разные вещи о том, как лучше всего освободить свойства.

Если у меня есть:
в .ч:

@property(retain) NSString *myStr;

и в .м:

@synthesize myStr = _iVarStr;

Должен ли мой диллок иметь:

[_iVarStr release];  

или

self.myStr = nil;   

или что-то еще?

Спасибо!

Ответы [ 4 ]

1 голос
/ 19 марта 2010

И self.myStr = nil, и [myStr release] в конечном итоге делают одно и то же.

Вызов [myStr release] очевиден и просто освобождает его.

Между тем, метод установки для myStr выглядит примерно следующим образом:

- (void)setMyStr:(NSString *)newMyStr
{
    [newMyStr retain];
    [myStr release];
    myStr = newMyStr;
}

Итак, когда мы делаем self.myStr = nil, мы сначала сохраняем нулевой объект, который ничего не делает. Затем мы освобождаем старую переменную, чего мы и хотим. Наконец, мы устанавливаем указатель на ноль.

Какая разница? Последний устанавливает указатель на ноль. Это лучше, потому что если мы (случайно) отправим сообщение освобожденному объекту, мы потерпим крах, если указатель не равен нулю (EXC_BAD_ACCESS). Теперь, честно говоря, поскольку вы находитесь в -dealloc, объект все равно уничтожается, поэтому не имеет значения, что вы используете.

0 голосов
/ 19 марта 2010

Я рекомендую вам использовать self.ivar=nil (код ivar=nil, который я ранее написал неправильно) в методе dealloc. Потому что, если свойство ивара меняется с сохранения на назначение (или с назначения на сохранение), вам не нужно менять свой код.

0 голосов
/ 19 марта 2010

Если для свойства установлено сохранение, то

self.ivar = nil;

будет правильно управлять распределением памяти.Для других типов собственности проверьте на странице официальной документации .Он также содержит несколько примеров кода, чтобы вы могли понять, что происходит "под капотом" для всех опций.

0 голосов
/ 19 марта 2010

Ваша сделка должна быть такой:

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

Хотя установка свойства на nil возможна, я беспокоюсь о непреднамеренных побочных эффектах или действиях KVO, вызванных изменением, которое может не понимать, что объект в настоящее время освобождается.

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