NSMutableArray:调用方法时的内存pipe理

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

在viewDidLoad中:

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

在ShuffleOnlyArray方法中:

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

在洗牌方法:

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

在Shuffle方法中似乎有内存泄漏。

我应该释放imagemarray或将其设置为零? 如果它应该被释放,它应该是autoreleased?

 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:多一个解决scheme:

按照SO链接中的提示使用类别进行随机播放

不需要创build新的和释放arrays。

1您已经在下面的行中有内存泄漏。

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

 imageMArray = [self shuffleOnlyArray:imageMArray]; 

在第一行中,创build一个保留计数为1的对象。然后,您说imageMArray指针指向其他对象。 您应该释放第一个对象,因为您将对第一个对象的引用放在一边,并且在更改引用之后无法释放它!

2你不应该使用retain,因为你的ShuffleOnlyArray方法返回一个保留的对象。 你的工厂方法应该返回一个autorelease对象,工厂的调用者应该决定是否保留它。

希望我已经清楚了