永远不会读取在初始化期间存储到'myKeyArray'的值

时间:2012-09-30 21:01:10

标签: objective-c memory-leaks

我得到“在初始化过程中存储到'myKeyArray'的值永远不会被读取”标记行的消息,我不太明白为什么会发生这种情况。

- (void)createAndMigrateStatisticalDataForPlayersToV3 {

NSString *playerStatsfilePath = [self dataFilePath5]; 
NSString *playerDatafilePath = [self dataFilePath6];  
NSArray *myKeyArray = [[NSArray alloc]init]; <<<< "Value stored to 'myKeyArray' during its initialization is never read"
NSMutableArray *theObjects = [[NSMutableArray alloc]init]; <<<< "Value stored to 'myKeyArray' during its initialization is never read"

NSFileManager *fileMgr;
fileMgr = [NSFileManager defaultManager];

if ([fileMgr fileExistsAtPath: playerDatafilePath] == YES) {

    NSMutableDictionary *gameFileDict = [NSMutableDictionary dictionaryWithContentsOfFile:playerDatafilePath];

    NSMutableArray *dataArray = [[NSMutableArray alloc]init];
    NSMutableArray *newDataArray = [[NSMutableArray alloc]init];

    myKeyArray = [gameFileDict allKeys];

    int nrOfKeys = [myKeyArray count];

    for (int oo = 0; oo < nrOfKeys; oo++) {
        theObjects = [gameFileDict valueForKey:[myKeyArray objectAtIndex:oo]];
        [dataArray addObject:[myKeyArray objectAtIndex:oo]];    // Name
        [dataArray addObject:[theObjects objectAtIndex:1]];     // # of games played
        [dataArray addObject:[theObjects objectAtIndex:2]];     // # correct answers 
        [dataArray addObject:[theObjects objectAtIndex:3]];     // # questions
        [dataArray addObject:[theObjects objectAtIndex:4]];     // # of games won
        [dataArray addObject:[theObjects objectAtIndex:5]];     // # of games lost
    }

    int dataCount = [dataArray count];
    float avgNrOfQuestionsPerGame = 0;
    float avgNrCorrectAnswersPerGame = 0;
    float nrOfQuestions = 0;
    float nrOfCorrectAnswers = 0;
    float nrOfGamesPerPlayer = 0;
    float nrOfMatchesWonPerPlayer = 0;
    float nrOfMatchesLostPerPlayer = 0;

    for (int oo = 0; oo < dataCount; oo = oo + 6) {

        nrOfGamesPerPlayer = [[dataArray objectAtIndex:oo+1]floatValue];
        nrOfCorrectAnswers = [[dataArray objectAtIndex:oo+2]floatValue];
        nrOfQuestions = [[dataArray objectAtIndex:oo+3]floatValue];
        nrOfMatchesWonPerPlayer = [[dataArray objectAtIndex:oo+4]floatValue];
        nrOfMatchesLostPerPlayer = [[dataArray objectAtIndex:oo+5]floatValue];

        //           nrOfGamesPerPlayer = nrOfMatchesLostPerPlayer + nrOfMatchesLostPerPlayer;
        avgNrOfQuestionsPerGame = nrOfQuestions / nrOfGamesPerPlayer;
        avgNrCorrectAnswersPerGame = nrOfCorrectAnswers / nrOfGamesPerPlayer;

        for (int ff = 0; ff < nrOfGamesPerPlayer; ff++) {
            [newDataArray addObject:[dataArray objectAtIndex:oo]];      //PlayerName
            [newDataArray addObject:[self get_the_Date]];               //set todays date
            [newDataArray addObject:[NSNumber numberWithInt:avgNrOfQuestionsPerGame]];
            [newDataArray addObject:[NSNumber numberWithInt:avgNrCorrectAnswersPerGame]];


        }
    }
    [newDataArray writeToFile:playerStatsfilePath atomically: TRUE];
}

2 个答案:

答案 0 :(得分:7)

我会把这条线拿出来,你不需要初始化它。

//NSArray *myKeyArray = [[NSArray alloc]init];

将此更改为

NSArray *myKeyArray;

如果它是可变的,你只需要分配它。

答案 1 :(得分:1)

在为它们分配内存之后,你将重新分配myKeyArray和theObjects,因此你会有大量的内存泄漏。

使用分配删除声明,并将变量声明移动到执行赋值的行:

NSArray *myKeyArray = [gameFileDict allKeys];

对象:

NSArray *theObjects = [gameFileDict valueForKey:[myKeyArray objectAtIndex:oo]];

请注意,您不必将其声明为NSMutableArray。你没有改变阵列。