2

UITextView のテキストを設定するために使用できる NSString を作成しています。

for (int score = 0; score < 100; score++){
   NSString *newScore = [NSString stringWithFormat:@"Score: %d", score];
   [_scoreText setText:newScore];
}

私の質問は、ループが完了した後、手動で割り当てを解除しなければならない 100 個のオブジェクトがメモリ内に存在するか、それともループのスコープを離れた後に ObjectiveC が自動的にガベージをクリーンアップするかということです。

4

1 に答える 1

8

いいえ。

ARC の有無にかかわらずstringWithFormat:、自動解放されたオブジェクトが返されます。

そのため、ループで作成されたすべてのNSStringインスタンスは、ループ実行後のある時点で割り当て解除されます (つまり、自動解放プールが空になったとき)。

とにかく、ループ内に多くの自動解放オブジェクトを作成している場合は、ループ本体を@autoreleasepoolブロック内にラップして、反復ごとに文字列が解放されるようにすることをお勧めします。

for (int score = 0; score < 100; score++){
   @autoreleasepool {
       NSString *newScore = [NSString stringWithFormat:@"Score: %d", score];
       [_scoreText setText:newScore];
   }
}

これにより、繰り返しが多い場合にループのパフォーマンスが大幅に向上します。

于 2013-06-30T01:29:17.737 に答える