1

ここにコードがあります。メモリを正しく管理するのを手伝ってくれませんか?

- (void) buildSpritesWithName:(NSString*)sN {

    self.arrayPages = [[NSMutableArray alloc] initWithCapacity:self.numPages];
    NSString *spriteName0 = [NSString stringWithFormat:@"%@%i.png", sN, 0];
    CCSprite *temp0 = [CCSprite spriteWithSpriteFrameName:spriteName0];

    NSLog(@"temp sprite %@ size : %f / %f",spriteName0, temp0.contentSize.width, temp0.contentSize.height);

    self.imgSize = CGSizeMake(temp0.contentSize.width, temp0.contentSize.height);


    for (int c = 1; c <= numberOfWheelFacesCycles; c++) {

        for (int x = 1; x <= self.numPages; x++) {

            NSString *spriteName = [NSString stringWithFormat:@"%@%i.png",sN, x];
            CCSprite *temp = [CCSprite spriteWithSpriteFrameName:spriteName];

            [self.arrayPages addObject:temp];
        }
    }

    NSLog(@"%i Pages built",self.arrayPages.count);
}

アナライザーは、次の行に「オブジェクトの潜在的なリーク」と表示します:

NSString *spriteName0 = [NSString stringWithFormat:@"%@%i.png", sN, 0];

どうして ?NSString は autorelease ですよね?どのオブジェクトがリークする可能性がありますか?

別のクラスに次のものがありますが、問題は何ですか:

self.name = [playersNames objectAtIndex:type];

ところで、ループの管理がうまくいかなかったら、アドバイスもいただけますか?

ご協力いただきありがとうございます

4

1 に答える 1

5

のプロパティまたはアクセサを見てくださいarrayPages。保持されている場合は、次の呼び出し時に潜在的なリークが発生します。

self.arrayPages = [[NSMutableArray alloc] initWithCapacity:self.numPages];

保持する場合arrayPagesは、代わりに次のようにします。

self.arrayPages = [[[NSMutableArray alloc] initWithCapacity:self.numPages] autorelease];

またはもっと簡単に:

self.arrayPages = [NSMutableArray arrayWithCapacity:self.numPages];

ループに関しては、問題ないように見えますが、ループ内に多くの自動解放オブジェクトを作成することに注意してください。それらは、ある時点まで解放されません。

于 2013-01-25T15:03:06.830 に答える