Возвращать NSArray без утечки? - PullRequest
0 голосов
/ 22 июня 2010

Я боролся с лучшим шаблоном для возврата массива из статического метода.

В моем статическом методе getList (в классе BIUtility) я выделяю NSArray для возврата.в обратной строке я делаю:

return [array autorelease];

Затем в вызывающем методе я выделяю массив следующим образом:

NSArray * list = [[[NSArray alloc] initWithArray:[BIUtility getList]] retain];

Позже я освобождаю список, используя:

[list release];

Я думаю, что это вызывает утечку памяти, так как сохранение увеличивает количество сохраняемых единиц слишком много.Однако, если я не делаю сохранение, я получаю Bad_Exec, потому что он уже освободил класс.

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

Я ценю вашу помощь.

1 Ответ

1 голос
/ 22 июня 2010

Вы должны заменить:

NSArray * list = [[[NSArray alloc] initWithArray:[BIUtility getList]] retain];

С:

NSArray * list = [[BIUtility getList] retain];

Это потому, что getList фактически возвращает указатель на NSArray.

Однако, если это изменяемый массив, вы должны сказать [[BIUtility getList] copy];, чтобы случайно не изменить массив, на который ссылается другой объект.

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

Эти части отчета увеличивают количество:

 [anObject]] retain]
 [anClassname alloc]

[anObject copy] также создаст объект со счетом 1.

...