作者huangcooly (弱小豪)
看板MacDev
标题[问题] weak 属性release时机
时间Tue Oct 3 17:38:07 2017
最近做了一些尝试
遇到一个问题
我在ViewController中有两个property为
@property (weak, nonatomic) UKTextField *myTextField;
@property (weak, nonatomic) Person *person;
UKTextField为继承UITextField的类别
Person为自己定义的类别
两个类别我都有覆写dealloc的方法
让两个物件被回收时可以显示Log
测试如下
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"viewDidLoad Start");
//Assigning retained object to weak variable;
//object will be released after assignment
myTextField = [[UKTextField alloc] init];
//Assigning retained object to weak variable;
//object will be released after assignment
person = [Person new];
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"viewWillAppear Start");
}
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"viewDidAppear Start");
}
Log内容出现顺序如下
1.viewDidLoad Start
2.Person Dealloc
3.viewWillAppear Start
4.UKTextField dealloc
5.viewDidAppear Start
问题:
将UKTextField与Person皆设定为weak
就ARC来说当weak的物件应该再被指派完之後应该在viewDidLoad就会被回收了
但为什麽UKTextField会在viewWillAppear才会被回收呢??
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 42.77.201.168
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/MacDev/M.1507023491.A.B0A.html
※ 编辑: huangcooly (42.77.201.168), 10/03/2017 17:44:59
1F:推 darktt: release是从class的变数开始,直到变数全部release完了, 10/03 19:06
2F:→ darktt: class本体才行release 10/03 19:06
3F:→ yuanruo: 用weak初始化对像,为了优化其实底层是调用class method 10/03 19:55
4F:→ yuanruo: 等同於你初始完後它会被加到一个autoreleasePool里 10/03 19:56
5F:→ yuanruo: autoreleasePool 在viewDidload返回时,还没drain 10/03 19:58
6F:→ yuanruo: 它被延迟到willAppear 到didAppear中某个方法被drain 10/03 19:59
7F:→ yuanruo: 详细下断点自己去追stackTree 关键字AutoreleasePoolPage 10/03 20:01
8F:→ yuanruo: 或是你可以把code编成C++ 直接看源码 10/03 20:07