проблема с нулевым значением и выпуском?

#iphone #objective-c #xcode #nsarray #release

#iPhone #objective-c #xcode #nsarray #выпуск

Вопрос:

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

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

Ответ №1:

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

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

 [allAvailableServices release], allAvailableServices = nil;
  

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

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

Ответ №2:

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

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

Более чистый способ — использовать средства доступа и вызывать self.yourvariable = nil; .

Комментарии:

1. 1 за предложение свойств. Свойства вместо ivars очень помогают избежать проблем с памятью.