5

以下のテストコードを取得しました。
(この例では、retain なしではインターフェイスを静的に割り当てることができないことに直面しました。)

このコードブロックによって、retain とは何かを理解できました。
これがリークするかどうかを確認したいのですが、どこかでリリースする必要があります。単純に、配列を毎回再初期化したくありません。静的にしました。(メモリには不利ですが、速度には有利です)

この保持された静的配列をどこかで解放する必要がありますか? それは安全なコードですか、それとも静的を完全に削除して単語を保持し、単にarrayObjectsメソッドで古典的に初期化する必要がありますか? それで、あなたは私のために何を好むかもしれませんか?

-(NSUInteger)getCoordYByX:(int)ax
{
    NSUInteger ret_=-1;

    static NSArray *coordsX=nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        coordsX=[[NSArray arrayWithObjects:
                      [NSNumber numberWithInt:50],
                      [NSNumber numberWithInt:170],
                      [NSNumber numberWithInt:190],
                      [NSNumber numberWithInt:210],
                      [NSNumber numberWithInt:350],
                      nil]retain];
                      /*it is more longer. cropped for test purposes*/

});
    ret_=[[coordsX objectAtIndex:ax] unsignedIntegerValue];
return  ret_;

}


結論として
、なぜ static は配列の初期値を保持しないのでしょうか? そして
、保持を使用したい場合、メモリリークが発生する可能性がありますか?

4

2 に答える 2

1

static は、アプリケーションが終了するまで変数を有効にするだけです。static 宣言はリークしません。ここで、コードにリークが発生する可能性があると思います。なぜなら、

[[NSArray arrayWithObjects:
                  [NSNumber numberWithInt:50],
                  [NSNumber numberWithInt:170],
                  [NSNumber numberWithInt:190],
                  [NSNumber numberWithInt:210],
                  [NSNumber numberWithInt:350],
                  nil]retain];

に等しい

[[[[NSArray alloc] initWithObjects:
 [NSNumber numberWithInt:50],
 [NSNumber numberWithInt:170],
 [NSNumber numberWithInt:190],
 [NSNumber numberWithInt:210],
 [NSNumber numberWithInt:350],
   nil] autorelease] retain];

したがって、保持メッセージはリークを作成します。

于 2013-09-12T09:15:22.930 に答える