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

时间:2012-03-16 07:20:47

标签: iphone objective-c ios xcode cocoa-touch

在我的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还是将其设置为nil?如果它应该被释放,它应该自动释放吗?

2 个答案:

答案 0 :(得分:5)

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 link

中的说明使用类别进行随机播放

无需创建新阵列并释放阵列。

答案 1 :(得分:1)

1您已经在以下行中发生内存泄漏。

  

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

imageMArray = [self shuffleOnlyArray:imageMArray];

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

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

希望我足够清楚