[問題] weak 屬性release時機

作者: huangcooly (弱小豪)   2017-10-03 17:38:07
最近做了一些嘗試
遇到一個問題
我在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才會被回收呢??
作者: darktt (小朱)   2017-10-03 19:06:00
release是從class的變數開始,直到變數全部release完了,class本體才行release
作者: yuanruo (罪を憎んで人を憎まず)   2017-10-03 19:55:00
用weak初始化對像,為了優化其實底層是調用class method等同於你初始完後它會被加到一個autoreleasePool裡autoreleasePool 在viewDidload返回時,還沒drain它被延遲到willAppear 到didAppear中某個方法被drain詳細下斷點自己去追stackTree 關鍵字AutoreleasePoolPage或是你可以把code編成C++ 直接看源碼

Links booklink

Contact Us: admin [ a t ] ucptt.com