我试图理解__attribute__((objc_precise_lifetime))
/ NS_VALID_UNTIL_END_OF_SCOPE
在不同情况下的确切行为。这是我尝试的最小“工作”示例(显示可能需要的地方):
@interface Foo : NSObject @end
@implementation Foo
- (instancetype)init {
NSLog(@"Foo init");
return [super init];
}
- (void)dealloc {
NSLog(@"Foo dealloc");
}
@end
int main() {
@autoreleasepool {
Foo *foo = [Foo new]; // might need NS_VALID_UNTIL_END_OF_SCOPE...
id __weak weakFoo = foo;
NSLog(@"Foo: %@", foo);
// foo is no longer used at this point, so it could be released
NSLog(@"Weak foo: %@", weakFoo);
}
return 0;
}
但输出是:
Foo init
Foo: <Foo: 0x10020ba00>
Weak foo: <Foo: 0x10020ba00>
Foo dealloc
所以似乎ARC正在自动释放对象(即使启用了优化)。我如何构建一个简单的情况,ARC将积极释放一个不再使用的对象?