__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)模拟器中运行此代码。结果不同。 我想知道发生了什么?
答案 0 :(得分:0)
两种结果都是合理的。结果取决于实现,取决于其他人是否具有对[NSString stringWithFormat:]
或其他东西返回的字符串对象的引用,以及它是否甚至是动态分配的对象,而不是静态分配的对象
字符串文字计算指向程序生命周期中存在的静态分配对象的指针,而不是通过引用计数管理的内存。某些方法,例如[NSString stringWithString:]
,当给定一个不可变的字符串时,只返回给定的字符串,并且不会创建一个新的字符串对象,作为优化。
此处使用[NSString stringWithFormat:]
。它也可以简单地返回给定的格式字符串对象,如果它是一个不可变的字符串并且没有格式说明符。我没有亲自测试过,但也许这个优化被添加到OS版本之间[NSString stringWithFormat:]
。
无论如何,这种优化是否存在依赖于实现,对我们来说无关紧要,因为我们永远不应该依赖于对象是动态分配还是静态分配,或者是否有额外的引用或不。