在使用完NSString*对象后,是否必须解除分配?

Leo*_*tik 2 objective-c ios

我正在创建一个可用于为UITextView设置文本的NSString:

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

我的问题是:循环完成后,我将在内存中有100个对象,我必须手动释放,或者在我们离开循环范围后ObjectiveC会自动清理垃圾吗?

Gab*_*lla 8

没有.

有和没有ARC stringWithFormat:都会返回一个自动释放的对象.

因此NSString,在循环执行后的某个时刻(即自动释放池被耗尽时),将使用循环创建的所有实例都被释放.

无论如何,如果你在循环中创建了许多自动释放的对象,你可能想要将循环体包装在一个@autoreleasepool块中,以便在每次迭代时释放字符串

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

多次迭代的情况下,这可以显着提高循环的性能.