ChenYilong / iOSInterviewQuestions

iOS interview questions;iOS面试题集锦(附答案)--学习qq群或 Telegram 群交流 https://github.com/ChenYilong/iOSBlog/issues/21

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

第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,如您所写、也如孙源博客中描述的那样,viewDidLoadviewWillAppear两个方法运行在一次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 四处均有值。

commented

@yupliang 你的例子错了,指针成为野指针,地址值不会变化

commented

@mws100 因为那个成了字符串常量,存储在常量区,生命周期是整个 app 运行期间 : )