autoreleasePool在iOS 9中有所不同吗?

时间:2015-10-14 08:06:59

标签: ios9 nsautoreleasepool

__weak NSString *string_weak_ = nil;

- (void)viewDidLoad {
    [super viewDidLoad];
    @autoreleasepool {
        NSString *string = [NSString stringWithFormat:@"hello"];
        string_weak_ = string;
    }
    NSLog(@"string: %@", string_weak_);
}

`

string: (null) // in iPhone(iOS 8.1) simulator
string: hello  // in iPhone(iOS 9.0) simulator

我在iPhone(8.1)和iPhone(9.0)模拟器中运行此代码。结果不同。 我想知道发生了什么?

1 个答案:

答案 0 :(得分:0)

两种结果都是合理的。结果取决于实现,取决于其他人是否具有对[NSString stringWithFormat:]或其他东西返回的字符串对象的引用,以及它是否甚至是动态分配的对象,而不是静态分配的对象

字符串文字计算指向程序生命周期中存在的静态分配对象的指针,而不是通过引用计数管理的内存。某些方法,例如[NSString stringWithString:],当给定一个不可变的字符串时,只返回给定的字符串,并且不会创建一个新的字符串对象,作为优化。

此处使用[NSString stringWithFormat:]。它也可以简单地返回给定的格式字符串对象,如果它是一个不可变的字符串并且没有格式说明符。我没有亲自测试过,但也许这个优化被添加到OS版本之间[NSString stringWithFormat:]

无论如何,这种优化是否存在依赖于实现,对我们来说无关紧要,因为我们永远不应该依赖于对象是动态分配还是静态分配,或者是否有额外的引用或不。