iOS 9 中的 autoreleasePool 有何不同?

autoreleasePool is different in iOS 9?

__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

I 运行 此代码在 iPhone(8.1) 和 iPhone(9.0) simulator.The 中的结果不同。 请问怎么回事?

两个结果都是合理的。结果取决于实现,取决于其他人是否引用了由 [NSString stringWithFormat:] 或其他东西编辑的 return 字符串对象,以及它是否是一个动态分配的对象,而不是动态分配的对象。静态分配的对象。

字符串文字评估为指向静态分配对象的指针,这些对象在程序的生命周期内存在,并且不是由引用计数管理的内存。某些方法,例如[NSString stringWithString:],当给定一个不可变字符串时,简单地return给定的字符串,并不会创建一个新的字符串对象,作为优化。

这里用的是[NSString stringWithFormat:]。它也可以简单地 return 给定的格式字符串对象,在它是不可变字符串并且没有格式说明符的情况下。我没有亲自测试过,但也许这个优化被添加到 OS 版本之间的 [NSString stringWithFormat:] 中。

无论如何,是否存在这样的优化取决于实现,对我们来说应该无关紧要,因为我们永远不应该依赖诸如对象是动态分配还是静态分配,或者是否有其他引用之类的东西对不对。