[問題] weak 屬性release時機

看板MacDev作者 (弱小豪)時間7年前 (2017/10/03 17:38), 7年前編輯推噓1(107)
留言8則, 2人參與, 7年前最新討論串1/1
最近做了一些嘗試 遇到一個問題 我在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

10/03 19:06, 7年前 , 1F
release是從class的變數開始,直到變數全部release完了,
10/03 19:06, 1F

10/03 19:06, 7年前 , 2F
class本體才行release
10/03 19:06, 2F

10/03 19:55, 7年前 , 3F
用weak初始化對像,為了優化其實底層是調用class method
10/03 19:55, 3F

10/03 19:56, 7年前 , 4F
等同於你初始完後它會被加到一個autoreleasePool裡
10/03 19:56, 4F

10/03 19:58, 7年前 , 5F
autoreleasePool 在viewDidload返回時,還沒drain
10/03 19:58, 5F

10/03 19:59, 7年前 , 6F
它被延遲到willAppear 到didAppear中某個方法被drain
10/03 19:59, 6F

10/03 20:01, 7年前 , 7F
詳細下斷點自己去追stackTree 關鍵字AutoreleasePoolPage
10/03 20:01, 7F

10/03 20:07, 7年前 , 8F
或是你可以把code編成C++ 直接看源碼
10/03 20:07, 8F
文章代碼(AID): #1Pqrg3iA (MacDev)
文章代碼(AID): #1Pqrg3iA (MacDev)