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对象,工厂的调用者应该决定是否保留它。
希望我已经清楚了