autorelease

来源:互联网 发布:经期提前 知乎 编辑:程序博客网 时间:2024/05/22 05:15

1.Autorelease对象什么时候释放?

如果答案是“当前作用域大括号结束时释放”,显然木有正确理解Autorelease机制。
在没有手加Autorelease Pool的情况下,Autorelease对象是在当前的runloop迭代结束时释放的,而它能够释放的原因是系统在每个runloop迭代中都加入了自动释放池Push和Pop.
/* 小代码 */
__weak id reference = nil;
- (void)viewDidLoad {
[super viewDidLoad];
NSString *str = [NSString stringWithFormat:@”sunnyxx”];
// str是一个autorelease对象,设置一个weak的引用来观察它
reference = str;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@”%@”, reference); // Console: sunnyxx
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
NSLog(@”%@”, reference); // Console: (null)
}
由于这个vc在loadView之后便add到了window层级上,所以viewDidLoad和viewWillAppear是在同一个runloop调用的,因此在viewWillAppear中,这个autorelease的变量依然有值。

当然,我们也可以手动干预Autorelease对象的释放时机:

  • (void)viewDidLoad
    {
    [super viewDidLoad];
    @autoreleasepool {
    NSString *str = [NSString stringWithFormat:@”sunnyxx”];
    }
    NSLog(@”%@”, str); // Console: (null)
    }
0 0
原创粉丝点击