有人可以在这段代码中告诉我为什么会有内存泄漏?
我在代码中添加了Analyzer中的注释。如果有人能帮助我并解释为什么我会得到这两条评论,我将不胜感激?
- (void)viewDidDisappear:(BOOL)animated {
// Empty array to be sure it is empty
[playerArray removeAllObjects];
//============CLEAN OUT DOUBLE NAMES FROM ARRAY==============//
NSArray *sortedDummyArray = [[NSArray alloc] initWithArray:selectedPlayersArray];
////>>>>The line above is line 84<<<<<<<////
// Sort the array
sortedDummyArray = [sortedDummyArray sortedArrayUsingSelector:@selector(compare:)];
NSMutableArray *finalArray = [[NSMutableArray alloc]initWithArray:sortedDummyArray];
////>>>>>> Possible memory leak on line 84 <<<<<<<<////
int xx = [sortedDummyArray count];
int yy;
int counter = 0;
int rr = 0;
for (int oo = 0; oo < xx; oo++) {
yy = [finalArray count];
for (int zz = 0; zz < yy; zz++) {
// If hit, clean out the double name
if ([[sortedDummyArray objectAtIndex:oo] isEqualToString:[finalArray objectAtIndex:rr]]) {
counter++;
// Check if there is more than one of this name
if (counter > 1) {
[finalArray removeObjectAtIndex:rr];
rr--;
counter--;
}
}
rr++;
}
counter = 0;
rr = 0;
}
[sortedDummyArray retain];
// Save who is in the game
AccessQuestionsDB *shufflePlayersFunction = [AccessQuestionsDB new];
finalArray = [shufflePlayersFunction shufflePlayers: finalArray];
[shufflePlayersFunction release];
TempPlayersInTheGame *savePlayersInTheGame = [TempPlayersInTheGame new];
[savePlayersInTheGame saveSelectedPlayers:finalArray];
[savePlayersInTheGame release];
[finalArray release]; //>>>> see comment below
////>>>>>Incorrect decrement of the reference count of an object that is not owned at this point by the caller <<<<<</////
[sortedDummyArray release];
[super viewDidDisappear:animated];
}
答案 0 :(得分:3)
您的第一次泄漏是因为您致电:
[sortedDummyArray retain];
你已经调用了一个这样做的alloc,但是你最后只发布了一次(所以删除上面一行)然后你也重新分配它是不正确的。
导致第二次泄漏是因为您已使用alloc设置finalArray,然后将其替换为函数的结果。你可以通过替换这一行解决这个问题:
NSMutableArray *finalArray = [[NSMutableArray alloc]initWithArray:sortedDummyArray];
有了这个:
NSMutableArray *finalArray = [NSMutableArray arrayWithArray:sortedDummyArray];
然后删除这一行:
[finalArray release];
所以你的功能总是这样:
- (void)viewDidDisappear:(BOOL)animated {
// Empty array to be sure it is empty
[playerArray removeAllObjects];
//============CLEAN OUT DOUBLE NAMES FROM ARRAY==============//
// Sort the array
NSArray *sortedDummyArray = [selectedPlayersArray sortedArrayUsingSelector:@selector(compare:)];
NSMutableArray *finalArray = [NSMutableArray arrayWithArray:sortedDummyArray];
int xx = [sortedDummyArray count];
int yy;
int counter = 0;
int rr = 0;
for (int oo = 0; oo < xx; oo++) {
yy = [finalArray count];
for (int zz = 0; zz < yy; zz++) {
// If hit, clean out the double name
if ([[sortedDummyArray objectAtIndex:oo] isEqualToString:[finalArray objectAtIndex:rr]]) {
counter++;
// Check if there is more than one of this name
if (counter > 1) {
[finalArray removeObjectAtIndex:rr];
rr--;
counter--;
}
}
rr++;
}
counter = 0;
rr = 0;
}
// Save who is in the game
AccessQuestionsDB *shufflePlayersFunction = [AccessQuestionsDB new];
finalArray = [shufflePlayersFunction shufflePlayers: finalArray];
[shufflePlayersFunction release];
TempPlayersInTheGame *savePlayersInTheGame = [TempPlayersInTheGame new];
[savePlayersInTheGame saveSelectedPlayers:finalArray];
[savePlayersInTheGame release];
[super viewDidDisappear:animated];
}
但所有这些都是过度只是为了删除重复的条目,将您的数组转换为NSSet(它始终是唯一的)然后将其转换回NSArray应该为您处理这个,所以您的功能:
- (void)viewDidDisappear:(BOOL)animated {
// Empty array to be sure it is empty
[playerArray removeAllObjects];
//============CLEAN OUT DOUBLE NAMES FROM ARRAY==============//
NSSet *uniquePlayers = [NSSet setWithArray:selectedPlayersArray];
// Save who is in the game
AccessQuestionsDB *shufflePlayersFunction = [AccessQuestionsDB new];
NSArray *finalArray = [shufflePlayersFunction shufflePlayers: [uniquePlayers allObjects]];
[shufflePlayersFunction release];
TempPlayersInTheGame *savePlayersInTheGame = [TempPlayersInTheGame new];
[savePlayersInTheGame saveSelectedPlayers:finalArray];
[savePlayersInTheGame release];
[super viewDidDisappear:animated];
}
答案 1 :(得分:1)
是否需要保留dummySortedArray的调用?我认为当你开始收集时,你可能已经有了保留计数
NSArray * sortedDummyArray = [[NSArray 页头] initWithArray:selectedPlayersArray];
答案 2 :(得分:1)
你的问题就在这一行:
finalArray = [shufflePlayersFunction shufflePlayers: finalArray];
之前,您正在内存中创建一个新数组,并告诉finalArray指向它。但这一行告诉finalArray指向不同的东西。所以现在,你创建的原始数组仍然在内存中,而且你正在发布一个不同的数组。
您也可以使用sortedDummyArray执行完全相同的操作。如果您分配了一个对象,请不要将指针设置为指向其他内容。