第34题,autorelease对象的释放时机,对iOS9、10系统不适用
mws100 opened this issue · comments
__weak id reference = nil;
- (void)viewDidLoad {
[super viewDidLoad];
NSString *obj = [NSString stringWithFormat:@"mws"];
reference = obj;
NSLog(@"1-%@", reference);
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"2-%@", reference);
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
NSLog(@"3-%@", reference);
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
NSLog(@"4-%@", reference);
}
测试代码如上,在iOS8.4上第3处打印是null,如您所写、也如孙源博客中描述的那样,viewDidLoad
与viewWillAppear
两个方法运行在一次runloop迭代中。viewDidAppear
执行时,上次runloop迭代已经释放了autorelease的obj对象。
但在iOS9.3、iOS10.3上测试时,四处打印均有值。
请问是苹果改变了机制,还是别的原因呢
2017-10-25 10:51:32.707985+0800 AA[78611:3959631] 1-<NSObject: 0x600000005b10>
2017-10-25 10:51:32.708247+0800 AA[78611:3959631] 2-<NSObject: 0x600000005b10>
2017-10-25 10:51:32.771229+0800 AA[78611:3959631] 3-<NSObject: 0x600000005b10>
2017-10-25 10:51:36.839959+0800 AA[78611:3959631] 4-<NSObject: 0x600000005b10>
2017-10-25 10:52:43.616817+0800 AA[78611:3959631] 4-<NSObject: 0x600000005b10>
测试环境 :模拟器iPhone 6s iOS 11.0.1 ,MRC。
测试代码
@interface ViewController ()
@property (nonatomic,assign) id reference;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSObject *obj = [NSObject new];
self.reference = obj;
NSLog(@"1-%@", self.reference);
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"2-%@", self.reference);
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
NSLog(@"3-%@", self.reference);
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
NSLog(@"4-%@", self.reference);
}
@mws10 四处均有值。