#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 очень помогают избежать проблем с памятью.