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