Разница между выпуском и выпуском затем устанавливается на ноль - PullRequest
5 голосов
/ 11 мая 2010

В чем разница между двумя фрагментами?

[myObj release];

и

[myObj release];
myObj = nil;

Ответы [ 5 ]

4 голосов
/ 11 мая 2010

Если вы просто отпустите объект, он станет освобожденным объектом.

И если вы попытаетесь выполнить какую-либо операцию с освобожденным объектом, ваше приложение вылетает. Чтобы избежать таких аварий, всегда предпочтительнее «назначить объект на ноль после его освобождения» Потому что мы все знаем, что любые операции, выполняемые с nil, не будут выполняться:)

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

Это большая проблема в управлении памятью.Если вы используете свойство, то вы можете использовать nil без использования release.Поскольку метод установки свойства работает следующим образом:

- (void)setObjTypes:(NSArray *)ObjTypes {
    [ObjTypes retain];
    [_ObjTypes release];
    _ObjTypes = ObjTypes;
}

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

Метод сеттера автоматически применяет метод release и затем устанавливает значение переменной экземпляра с помощью nil.Но если вы не используете свойство, то очень приятно, что перед установкой nil мы должны сначала установить release. Если мы установили указатель на nil, это означает, что он не указывает на какой-либо адрес памяти, поэтому, если мы пытаемся получить доступ к этой памяти, используя вышеуказатель то вылетитИ если мы вызываем метод release для переменной экземпляра, он освобождает память.

1 голос
/ 11 мая 2010

Вы должны быть осторожны с первым, потому что после того, как вы отпустите, указатель по-прежнему будет указывать на некоторую выделенную память и может содержать какой-то другой объект. Итак, в первом случае, если вы попробуете [myObj release], а затем [myObj doSomething], приложение может аварийно завершить работу

Мой совет: всегда устанавливайте ноль после выпуска.

1 голос
/ 11 мая 2010

Не очень. Вторая форма просто предотвращает случайное использование памяти, как если бы она все еще была объектом. (Если быть точным, как если бы это был тот же объект, адрес памяти, скорее всего, вскоре будет использован для нового объекта.)

0 голосов
/ 11 мая 2010

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

Так что, как упоминали ребята, указатель все равно будет указывать на то же место.

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