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

Arp*_*ekh 0 iphone xcode cocoa-touch objective-c ios

在我的iOS应用程序中,我使用的是名为imageMArray的NSMutableArray.我已设置其getter和setter属性并实例化它.

在viewDidLoad中:

imageMArray=[[NSMutableArray alloc] initWithArray:CategoryImages];
imageMArray=[self shuffleOnlyArray:imageMArray];
Run Code Online (Sandbox Code Playgroud)

在ShuffleOnlyArray方法中:

 NSMutableArray *destArray1 = [[NSMutableArray alloc] initWithCapacity: [sourceArray count]] ;
return destArray1;
Run Code Online (Sandbox Code Playgroud)

在shuffle方法:

imageMArray=[[self shuffleOnlyArray:imageMArray] retain];
Run Code Online (Sandbox Code Playgroud)

Shuffle方法中似乎存在内存泄漏.

我应该释放imageMArray还是将其设置为nil?如果它应该被释放,它应该被自动释放吗?

Ila*_*ian 5

imageMArray=[[NSMutableArray alloc] initWithArray:CategoryImages];
Run Code Online (Sandbox Code Playgroud)

在上面的陈述中,你有一个记忆漏洞.相反,你可以像下面这样.

imageMArray = [NSMutableArray arrayWithArray:CategoryImages];
Run Code Online (Sandbox Code Playgroud)

在ShuffleOnlyArray方法中,返回自动释放的对象.

NSMutableArray *destArray1 = [[NSMutableArray alloc] initWithCapacity: [sourceArray count]] ;
return [destArray1 autorelease];
Run Code Online (Sandbox Code Playgroud)

但是在得到它之后,保留(获取所有权)数组对象.

imageMArray=[[self shuffleOnlyArray:imageMArray] retain];
Run Code Online (Sandbox Code Playgroud)

编辑

shuffle方法中,执行以下操作:

NSMutableArray *imageMArray1 = [imageMArray mutableCopy];
if( imageMArray )
{
   [imageMArray release];
}
imageMArray=[[self shuffleOnlyArray:imageMArray1] retain];
[imageMArray1 release];
Run Code Online (Sandbox Code Playgroud)

编辑2: 另一个解决方案:

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

无需创建新的并释放阵列.