Установка объекта ноль против выпуска + Realloc

голоса
9

Это не мусора среда

У меня есть переменная экземпляра класса, который в каком-то момент в моем выполнении, мне нужно повторно инициализировать с другим набором данных, чем он был первоначально построен с.

Гипотетически говоря, что , если у меня есть NSMutableArrayили NSMutableDictionary, было бы более эффективным , чтобы сделать что - то такое , как:

[myArr release];
myArr  = [[NSMutableArray alloc] init....];

или просто,

myArr = nil;

Будет ли myArr освободить объект и оставить меня без указателя на хранение в памяти, так что я могу повторно использовать myArr?

Задан 09/03/2009 в 17:03
источник пользователем
На других языках...                            


6 ответов

голоса
21

Если вы делаете myArr=nil;самостоятельно, то вы потеряли указатель , к которому вы можете отправить releaseсообщение. Там нет магии releaseобъекта.

И, как говорит Георг, не будучи в состоянии выпустить свой объект, что память «утечка».

Ответил 09/03/2009 в 17:07
источник пользователем

голоса
6

Вы можете использовать свойство и получить почти синтаксис вы хотите без утечки памяти.

Используйте этот синтаксис для объявления массива

@property (readwrite, retain) NSMutableArray *myArray;

Затем повторно инициализировать его следующим образом:

[self setMyArray:[NSMutableArray array]];
Ответил 09/03/2009 в 17:59
источник пользователем

голоса
5

Если бы вы были на Mac OS, а не iPhone OS, я бы сказал, что это зависит от того, включена ли сборщик мусора или нет:

  • с GC: использование myArr = nil;
  • без GC: использование [myArr release];

К сожалению, на iPhone, нет мусора, поэтому, если вы не хотите утечек памяти, вы должны освободить свой объект, как только вы больше не нужны.

Ответил 09/03/2009 в 17:13
источник пользователем

голоса
4

Первый кодовый блок в порядке. Тем не менее, второй блок не оставит вас с массивом вы можете использовать, так что не достаточно. Половина коррекции этого блока, я думаю, вы имели в виду:

myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Однако, это не сделать то, что вы хотите, либо потому, что вы не отпуская myArr. Если вы синтезировали сеттер для myArr, то вы можете получить поведение выхода вы хотите от установки до нуля, используя сеттер (self.myArr) вместо того, чтобы получить доступ к указателю непосредственно (myArr). Исправляющие второй блок полностью:

self.myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Теперь мы имеем эквивалентные примеры кода, один с помощью сеттеров с нулем, чтобы освободить, а другие нет. Они одинаковые.

Если myArr является изменяемым массивом, как в этих примерах, наиболее эффективным методом является использование removeAllObjects, избегая всю работу освобождения памяти только требовать его обратно:

[myArr removeAllObjects];
Ответил 02/12/2009 в 11:08
источник пользователем

голоса
1

Если то, что вы хотите сбросить содержимое NSMutableArray / NSMutableDictionary, вы также можете позвонить removeAllObjects и у вас есть свежий массив / Dict для работы.

Ответил 13/03/2009 в 22:37
источник пользователем

голоса
1

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

«Высвобождение объекта» не является «ничего», так что это не делает этого. :) В сборках мусора языка может сделать это как побочный эффект падения ссылки, но в Objective C не работает таким образом.

Ответил 09/03/2009 в 17:09
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more