看板 MacDev 關於我們 聯絡資訊
最近做了一些嘗試 遇到一個問題 我在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://www.ptt.cc/bbs/MacDev/M.1507023491.A.B0A.html ※ 編輯: huangcooly (42.77.201.168), 10/03/2017 17:44:59
darktt: release是從class的變數開始,直到變數全部release完了, 10/03 19:06
darktt: class本體才行release 10/03 19:06
yuanruo: 用weak初始化對像,為了優化其實底層是調用class method 10/03 19:55
yuanruo: 等同於你初始完後它會被加到一個autoreleasePool裡 10/03 19:56
yuanruo: autoreleasePool 在viewDidload返回時,還沒drain 10/03 19:58
yuanruo: 它被延遲到willAppear 到didAppear中某個方法被drain 10/03 19:59
yuanruo: 詳細下斷點自己去追stackTree 關鍵字AutoreleasePoolPage 10/03 20:01
yuanruo: 或是你可以把code編成C++ 直接看源碼 10/03 20:07