Iphone NSMutableArray:调用方法时的内存管理

Iphone NSMutableArray:调用方法时的内存管理,iphone,objective-c,ios,xcode,cocoa-touch,Iphone,Objective C,Ios,Xcode,Cocoa Touch,在我的iOS应用程序中,我使用一个名为imageMArray的NSMutableArray。我已经设置了它的getter和setter属性并实例化了它 在视图中加载: imageMArray=[[NSMutableArray alloc] initWithArray:CategoryImages]; imageMArray=[self shuffleOnlyArray:imageMArray]; NSMutableArray *destArray1 = [[NSMutableArray al

在我的iOS应用程序中,我使用一个名为imageMArray的NSMutableArray。我已经设置了它的getter和setter属性并实例化了它

在视图中加载:

imageMArray=[[NSMutableArray alloc] initWithArray:CategoryImages];
imageMArray=[self shuffleOnlyArray:imageMArray];
 NSMutableArray *destArray1 = [[NSMutableArray alloc] initWithCapacity: [sourceArray count]] ;
return destArray1;
imageMArray=[[self shuffleOnlyArray:imageMArray] retain];
在ShuffleOnly数组方法中:

imageMArray=[[NSMutableArray alloc] initWithArray:CategoryImages];
imageMArray=[self shuffleOnlyArray:imageMArray];
 NSMutableArray *destArray1 = [[NSMutableArray alloc] initWithCapacity: [sourceArray count]] ;
return destArray1;
imageMArray=[[self shuffleOnlyArray:imageMArray] retain];
在洗牌法中:

imageMArray=[[NSMutableArray alloc] initWithArray:CategoryImages];
imageMArray=[self shuffleOnlyArray:imageMArray];
 NSMutableArray *destArray1 = [[NSMutableArray alloc] initWithCapacity: [sourceArray count]] ;
return destArray1;
imageMArray=[[self shuffleOnlyArray:imageMArray] retain];
洗牌方法中似乎存在内存泄漏


我应该释放imageMArray还是将其设置为零?如果应该释放,是否应该自动释放?

1以下行中已经存在内存泄漏

imageMArray=[[NSMutableArray alloc]initWithArray:CategoryImages]

imageMArray = [self shuffleOnlyArray:imageMArray];
在第一行中,创建一个保留计数为1的对象。 然后您说您的imageMArray指针指向另一个对象。您应该释放第一个对象,因为您破坏了对第一个对象的引用,并且在更改引用后无法释放它

2您不应该使用retain,因为您的
shuffleonlarray
方法返回一个保留的对象。 工厂方法应该返回一个自动释放对象,工厂的调用方应该决定是否保留它


希望我说得够清楚

1以下几行中已经有内存泄漏

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

imageMArray = [self shuffleOnlyArray:imageMArray];
在第一行中,创建一个保留计数为1的对象。 然后您说您的imageMArray指针指向另一个对象。您应该释放第一个对象,因为您破坏了对第一个对象的引用,并且在更改引用后无法释放它

2您不应该使用retain,因为您的
shuffleonlarray
方法返回一个保留的对象。 工厂方法应该返回一个自动释放对象,工厂的调用方应该决定是否保留它

希望我说得够清楚

imageMArray=[[NSMutableArray alloc] initWithArray:CategoryImages];
在上面的语句中,您有一个memoryleak。 相反,你可以像下面这样

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: 还有一个解决方案:

使用类别进行洗牌,如中所述

无需创建新阵列和发布阵列

在上面的语句中,您有一个memoryleak。 相反,你可以像下面这样

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: 还有一个解决方案:

使用类别进行洗牌,如中所述


不需要创建新的数组并释放数组。

嘿,但是我应该在什么时候释放数组,因为该方法包含相同的数组当我更改引用时,我应该在哪里释放它。你可以像Aadhira那样使数组自动释放,或者你只需调用。[马瑞发布];然后imageMarray=[self-shuffleyArray:imageMarray];。请记住,shuffleOnlyArray必须返回auto relsease,您必须像Aadhira那样保留imageMArray=[[self-shuffleOnlyArray:imageMArray]retain];嘿,但是我应该什么时候释放数组,因为方法包含相同的数组当我更改引用时,我应该在哪里释放它。你可以像Aadhira那样使数组自动释放,或者你只需调用。[马瑞发布];然后imageMarray=[self-shuffleyArray:imageMarray];。请记住,shuffleOnlyArray必须返回auto relsease,您必须像Aadhira那样保留imageMArray=[[self-shuffleOnlyArray:imageMArray]retain];真的有必要吗!!是的,你是对的。因为第一次我只是自动删除destary。不保留它会导致崩溃。@Adhira:我已经设置了属性并进行了合成,然后我还需要编写retain,因为否则它将包含自动删除的对象……你最好给他写代码。但是,如果他能理解为什么代码与您编写的代码一样,而不是他在做的代码一样,那也很好。@ArpitParekh,在
shuffle
方法中保留另一个数组之前,我将释放先前保留的数组。查看我的编辑。但如果我释放它,我如何使用它再次洗牌。。!!?真的有必要吗!!是的,你是对的。因为第一次我只是自动删除destary。不保留它会导致崩溃。@Adhira:我已经设置了属性并进行了合成,然后我还需要编写retain,因为否则它将包含自动删除的对象……你最好给他写代码。但是,如果他能理解为什么代码与您编写的代码一样,而不是他在做的代码一样,那也很好。@ArpitParekh,在
shuffle
方法中保留另一个数组之前,我将释放先前保留的数组。查看我的编辑。但如果我释放它,我如何使用它再次洗牌。。!!?