0

このメモリリークを解決する方法を見つけるのにあまり運がない楽器で遊んでいます。

まず、コード:

-(NSString *) randomizeHint:(NSString *) wordToShuffle{

    NSMutableString * outputstring = [NSMutableString stringWithCapacity:[wordToShuffle length]];
    NSMutableSet * usedNumberSet = [NSMutableSet setWithCapacity:[wordToShuffle length]];

    for (int i=0; i<[wordToShuffle length]; i++) {
        int randomnum = arc4random()%[wordToShuffle length];

        while ([usedNumberSet containsObject:[NSNumber numberWithInt:randomnum]]==YES) {
            randomnum = arc4random()%[wordToShuffle length];
        }

        [usedNumberSet addObject:[NSNumber numberWithInt:randomnum]];
        [outputstring appendFormat:@"%c",[wordToShuffle characterAtIndex:randomnum]];
    }

    CCLOG(@"outputstring is:%@",outputstring);
    return outputstring;

 }

Instrumentsは私に次のものを与えています:

Leaked Object = NSCFString, Responsible Library = Foundation, Responsible Frame = -[NSPlaceholderMutableString initWithCapacity:]

何か案は?

前もって感謝します。

4

2 に答える 2

2

特に戻り型がNSStringであるため、可変文字列を実際に使用する必要はありません。stringByAppendingFormatを使用するだけです。

-(NSString *) randomizeHint:(NSString *) wordToShuffle{

    NSString * outputstring = @"";

    NSMutableSet * usedNumberSet = [NSMutableSet setWithCapacity:[wordToShuffle length]];

    for (int i=0; i<[wordToShuffle length]; i++) {
        int randomnum = arc4random()%[wordToShuffle length];

        while ([usedNumberSet containsObject:[NSNumber numberWithInt:randomnum]]==YES) {
            randomnum = arc4random()%[wordToShuffle length];
        }

        [usedNumberSet addObject:[NSNumber numberWithInt:randomnum]];

        // just set outputstring like so... no need to worry about a leaky mutable string then
        outputstring = [outputstring stringByAppendingFormat:@"%c",
                    [wordToShuffle characterAtIndex:randomnum]];
    }


    return outputstring;

}
于 2012-07-16T16:53:46.383 に答える
0

返された文字列が使用されている場所を確認します。おそらく、あなたはそれを保持し、最初に保持された文字列を解放せずに、文字列を保持したオブジェクトの割り当てを解除しています。Instrumentsは、コードのこのセクションを「リークされた」オブジェクトとしてポイントします。最も難しい部分は、「リーカー」を見つけることです。そして、はい、あなたは文字列を漏らすことができます、私はちょうどそれのためのレシピを書きました。

于 2012-07-16T17:00:06.823 に答える