在我的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?如果它应该被释放,它应该自动释放吗?
答案 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对象,工厂的调用者应该决定是否保留它。
希望我足够清楚