2

マークされた行に対して「初期化中に「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];
}
4

2 に答える 2

7

この行を削除します。初期化する必要はありません。

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

これをに変更します

NSArray *myKeyArray;

変更可能な場合にのみ割り当てる必要があります。

于 2012-09-30T21:04:20.223 に答える
1

myKeyArrayとtheObjectsの両方にメモリを割り当てた後でそれらを再割り当てしているため、大量のメモリリークが発生します。

割り当てを含む宣言を削除し、変数宣言を割り当てを実行する行に移動します。

NSArray *myKeyArray = [gameFileDict allKeys];

theObjectsについても同じです。

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

NSMutableArrayとして宣言する必要はないことに注意してください。配列を変更していません。

于 2012-09-30T21:16:51.523 に答える