проблема с нулем и выпуском? - PullRequest
0 голосов
/ 30 мая 2011

Я использую NSArray с именем allAvailableServices .сначала я его инициализирую и после того, как написал [allAvailableServices release];, затем проверил условие if (allAvailableServices) .это стало правдой! могу я узнать причину. тогда я написал allAvailableServices = nil; и [allAvailableServices release]; после вышеприведенного кода if (allAvailableServices) пришло false. Есть ли проблема, что янаписал [allAvailableServices release]; после allAvailableServices = nil;

всякий раз, когда allAvailableServices = nil мне нужно выделить новый массив. Поэтому, если я не вызывал [allAvailableServices release];, я думаю, что есть проблема с памятью. Я прав?Кто-нибудь может дать мне лучший способ справиться с этим?

Ответы [ 2 ]

7 голосов
/ 30 мая 2011

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

Вот почему многие люди обнуляют свой указатель после его отпускания:

[allAvailableServices release], allAvailableServices = nil;

В Objective-C безопасно отправлять сообщение на ноль, но отправка сообщения на освобожденный объект может привести к сбою приложения (обычно с EXC_BAD_ACCESS)

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

1 голос
/ 30 мая 2011

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

Память все еще имеет какое-то значение, если вы не установили nil, и, следовательно, проблема в вашем условии if.

Более чистым способом является использование аксессоров и вызов self.yourvariable = nil;.

...