как правильно освобождать объекты в objective-c

#iphone #objective-c #release

#iPhone #objective-c #освободить

Вопрос:

Я должен что-то подтвердить. Я освобождаю свои объекты таким образом.

 [lblTotalQty, lblTotalAmt, imgEmptyBag, lblEmptyBagMsg release];
 

разве это неправильный способ?

Пожалуйста, направьте меня.

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

1. Ого, аккуратный, никогда не видел, чтобы кто-нибудь использовал список идентификаторов, разделенных запятыми, для отправки одного сообщения в … аккуратный.

2. То есть вы имеете в виду, что это неправильный способ. и мы не можем так поступить?

3. @Steve: было бы здорово, если бы это сработало.

Ответ №1:

Операторы запятой отбрасывают все выражения, кроме последнего, поэтому ваше утверждение фактически станет

 [lblEmptyBagMsg release];
 

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

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

1. 1 Благодаря вам я действительно кое-чему научился, прочитав эту тему, ЛОЛ. Есть причина, по которой я никогда раньше не видел сумасшедшего списка идентификаторов, разделенных запятыми!

2. Но, Дипак, у меня есть вопрос по этому поводу. Если мы можем определять переменные и можем создавать IBOutlet, можем определять свойства и можем синтезировать, то почему мы не можем освободить таким образом?

3. Потому что я создаю IBOutlet таким образом

4. Запятая в этих случаях действует как разделитель, а не оператор ( см. Это ). Это зависит от грамматики языка, и я считаю, что Objective-C не определяет его как разделитель.

Ответ №2:

Действительно сложно сказать, о чем вы здесь спрашиваете, потому что вы не даете контекста.

Во-первых, я никогда не видел, чтобы кто-нибудь использовал список идентификаторов, разделенных запятыми, для отправки одного сообщения, как вы делаете в своем примере… но я полагаю, что это не суть вопроса.

За исключением использования пулов автоматического освобождения, отправка release сообщения объекту является единственным способом их освобождения.

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

Ответ №3:

Что касается того, как вы освобождаете объекты, отправляя сообщение о выпуске:

 [myObject release];
 

Никогда раньше не видел синтаксиса с запятой, и кто-то предположил, что сообщение отправляется только последнему объекту (кто-нибудь может это подтвердить?)

Что касается того, когда, это долгая история, и я рекомендую вам прочитать документы Apple по этому вопросу; вы могли бы начать здесь.

По сути, вы должны отслеживать права собственности на объект, чтобы две стороны не освобождали один и тот же объект дважды или, наоборот, никогда.

Поначалу звучит громоздко, но это очень хорошая практика с точки зрения разработки программного обеспечения; Эта иерархия владения привносит значимую структуру в ваш код.

В качестве альтернативы, ЕСЛИ вы кодируете для Mac, вы можете использовать сборку мусора. Кроме того, если вы пишете для iOS 5.0 и начинаете новый проект, вы можете воспользоваться новой функциональностью ARC (автоматический подсчет ссылок), которая в основном представляет собой код ручного подсчета ссылок, автоматически генерируемый компилятором: лучшее из обоих миров.