Утечки памяти в Objective-C / массивах - PullRequest
1 голос
/ 01 июня 2011

Я смотрю на чей-то код и знаю общее правило: если у вас есть alloc / init, вам нужно освободить эту память.Он использует много NSMutableArrays, размещает / вводит их, но не освобождает их.Могу ли я просто отправить сообщение об автоматическом выпуске в массив, который создается, если я не вижу каких-либо других сообщений об освобождении / автоматическом выпуске, отправляемых в этот массив?Я в основном не хочу, чтобы его код аварийно завершал работу и прекращал работать: P.

С NSMutableArrays, когда вы отправляете сообщение addObject и объект в этом массиве увеличивает свою учетную запись, если этот массив освобождается, но объект никогда не получает освобождение или удаление объекта из массива, это также утечка памяти?Спасибо.

Ответы [ 3 ]

4 голосов
/ 01 июня 2011

Вам нужно либо -release или -autorelease что угодно -retain, +alloc, -copy, +allocWithZone: или -copyWithZone:. (И, если вы сохраняете что-то дважды, вам также нужно дважды отпустить.)

Когда объект NSMutableArray (или NSArray, NSSet, или NSDictionary и изменяемые подклассы) освобождается (освобождается счетчик достигает нуля), он освобождает все, что содержит. Когда вы добавляете объект в NSMutableArray, массив сохраняет объект (он не копирует его, как утверждают некоторые люди).

Я настоятельно рекомендую Руководство по программированию управления памятью и вам, и кому-то , о котором вы упоминали в этом вопросе.

Надеюсь, этот ответ поможет вам и кому-то . Удачи. :)


Также включите Clang Static Analyzer в настройках сборки. Это скажет вам во время компиляции, когда произойдет утечка (и многое, многое другое). Фактически, это первое, что я всегда делаю, когда начинаю новый проект. Анализатор никогда не обманывал меня.

0 голосов
/ 01 июня 2011

Общепринято освобождать все объекты, которые вы инициализируете. Но в вашем случае освобождение массива должно также освободить все объекты.

Но все зависит от того, как вы используете свои объекты !!!

0 голосов
/ 01 июня 2011

NSArray и NSMutableArray освобождают все свои объекты, когда они уничтожены, поэтому, если массив управляется должным образом с retain и release (или autorelease), объекты внутри не будут пропущены.Но если есть массивы, которые никогда не освобождаются, они будут вытекать вместе со всем, что находится внутри них.

Не видя код, трудно рекомендовать просто добавлять autorelease везде, но для используемых массивовтолько в контексте одной функции (а не присваиваемой ивару или статическим переменным) ответ - да, они должны быть autoreleased.Или, более идиотски, создайте их с помощью методов, подобных +arrayWithCapacity, который возвращает объект, который уже был добавлен в пул автоматического выпуска.

...