'ptr = nil' против '[ptr release]' в Objective-C? - PullRequest
0 голосов
/ 09 июля 2011

Я новичок в Objective-C и должен распределять и освобождать память.Я нахожу, что иногда, когда я пытаюсь использовать [ptr release] перед переназначением указателя, я получаю SIGABRT позже, тогда как, если я использую ptr = nil, я не делаю, но я не уверен, действительно ли это освобождаетна что указывал этот указатель.Поэтому я хотел бы точно знать, что делает ptr = nil, а не [ptr release].

Ответы [ 3 ]

4 голосов
/ 09 июля 2011

Это может быть проблемой из-за недостатка понимания правил управления памятью Какао, особенно в отношении владения объектами.В зависимости от того, как вы создаете объект, он принадлежит вам или кому-то другому.Нужно ли вам освобождать объект, зависит от того, являетесь ли вы владельцем объекта (вы либо сохранили его, либо создали его, используя метод, начинающийся с alloc, new, copy или mutableCopy),Подробнее о правилах можно прочитать в документации Apple по управлению памятью .

Кроме того, вам следует обратить внимание на любые правила, касающиеся свойств.Как упоминалось в sergio, если свойство указывает, что оно сохраняет объект, оно будет обрабатывать вызовы retain и release при назначении.Так, например, если вы выделяете что-то, используя alloc, у вас есть этот объект.Если вы затем назначаете его свойству, которое сохраняет объект, вы и свойство сохраняете объект, поэтому в зависимости от того, что вы делаете позже, вы также можете освободить объект, чтобы отказаться от владенияобъект.

Установка простого указателя на nil не освобождает объект и не считается как release.Таким образом, в зависимости от того, как вы создаете объект, вы должны знать, нужно ли вам освобождать объект или нет.Приведенная выше документация включает в себя примеры, которые также должны помочь вам в этом разобраться.Одно предостережение: этот тип изменений изменяется с автоматическим подсчетом ссылок, поскольку вы не выполняете любую обработку retain, release и т. Д., И компилятор по большей части вступает во владение, но есливы не используете ARC, пока не беспокойтесь об этом (но позаботьтесь об этом позже).

3 голосов
/ 09 июля 2011

Использование:

[ptr release];

вы на самом деле уменьшаете retainCount из ptr. Если retainCount для ptr упадет до 0, ptr будет освобожден, и память тоже.

Когда вы пишете ptr = nil;, вы просто «сбрасываете» адрес памяти, на который указывает ptr.

3 голосов
/ 09 июля 2011

ptr = nil сделает вашу переменную ptr равной nil и не освободит ваш указатель; поэтому причина, по которой он работает без SIGABRT, заключается в том, что объект не получает dealloc'ed.

Назначение nil также подразумевает release, когда вы назначаете свойство retain:

@property(nonatomic, retain) .... ptr;
.....
self.ptr = nil;

Рекомендуется следовать за оператором release с присвоением nil:

[ptr release];
ptr = nil;

это предотвратит любое нежелательное использование освобожденного объекта после освобождения (это в основном имеет смысл с классом ivars, который может использоваться в другом методе).

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

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