【问题标题】: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) 模拟器中运行此代码。结果不同。 我想知道发生了什么?

【问题讨论】:

    标签: ios9 nsautoreleasepool


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 但我在我的应用中看到了类似的东西。我的内存占用在 iOS 9 上非常高,而在 iOS 8 上看起来不错(= autorelease pool 工作正常)
    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    相关资源
    最近更新 更多