iOS 9 中的 autoreleasePool 有啥不同?

Posted

技术标签:

【中文标题】iOS 9 中的 autoreleasePool 有啥不同?【英文标题】:autoreleasePool is different in iOS 9?iOS 9 中的 autoreleasePool 有什么不同? 【发布时间】:2015-10-14 08:06:59 【问题描述】:
__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】:

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

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

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

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

【讨论】:

但我在我的应用中看到了类似的东西。我的内存占用在 iOS 9 上非常高,而在 iOS 8 上看起来不错(= autorelease pool 工作正常)

以上是关于iOS 9 中的 autoreleasePool 有啥不同?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 4.0 上释放 Autoreleasepool 崩溃(以及在 4.1 上......)

[iOS开发]@autoreleasepool原理探究

[iOS开发]@autoreleasepool原理探究

iOS 多线程,ARC

自动释放池的前世今生 ---- 深入解析 autoreleasepool

如何了解 iOS 上 autoreleasepools 的内容?