NSMutableArray: управление памятью при вызове методов - PullRequest
0 голосов
/ 16 марта 2012

В моем приложении для iOS я использую NSMutableArray с именем imageMArray.Я установил его свойства getter и setter и создал его.

In viewDidLoad:

imageMArray=[[NSMutableArray alloc] initWithArray:CategoryImages];
imageMArray=[self shuffleOnlyArray:imageMArray];

В методе ShuffleOnlyArray:

 NSMutableArray *destArray1 = [[NSMutableArray alloc] initWithCapacity: [sourceArray count]] ;
return destArray1;

В методе Shuffle:

imageMArray=[[self shuffleOnlyArray:imageMArray] retain];

В методе Shuffle возникает утечка памяти.

Должен ли я выпустить imageMArray или установить его вноль?Если это должно быть выпущено, это должно быть автоматически выпущено?

Ответы [ 2 ]

5 голосов
/ 16 марта 2012
imageMArray=[[NSMutableArray alloc] initWithArray:CategoryImages];

В приведенном выше утверждении у вас есть утечка памяти. Вместо этого вы можете сделать следующее:

imageMArray = [NSMutableArray arrayWithArray:CategoryImages];

В методе ShuffleOnlyArray возвращать автоматически освобожденный объект.

NSMutableArray *destArray1 = [[NSMutableArray alloc] initWithCapacity: [sourceArray count]] ;
return [destArray1 autorelease];

Но после того, как вы его получите, сохраните (перешли во владение) объект массива.

imageMArray=[[self shuffleOnlyArray:imageMArray] retain];

Редактировать

В методе shuffle выполните следующие действия:

NSMutableArray *imageMArray1 = [imageMArray mutableCopy];
if( imageMArray )
{
   [imageMArray release];
}
imageMArray=[[self shuffleOnlyArray:imageMArray1] retain];
[imageMArray1 release];

Редактировать 2: Еще одно решение:

Используйте категорию для перетасовки, как указано в ссылке SO

Нет необходимости создавать новые и освобождать массивы.

1 голос
/ 16 марта 2012

1 У вас уже есть утечка памяти в следующих строках.

imageMArray = [[NSMutableArray alloc] initWithArray: CategoryImages];

imageMArray = [self shuffleOnlyArray:imageMArray];

В первой строке вы создаете объект с сохранением количества 1. Затем вы говорите, что указатель imageMArray указывает на другой объект. Вы должны освободить первый объект, потому что вы теряете ссылку на первый объект и не можете освободить его после изменения ссылки!

2 Вы не должны использовать retain, потому что ваш метод ShuffleOnlyArray возвращает сохраненный объект. Ваш фабричный метод должен возвращать объект автоматического освобождения, а вызывающий фабрика должна решить, сохранит ли он его или нет.

Надеюсь, я достаточно ясно

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