[問題] viweDidUnload該填的內容為何?

看板MacDev作者 (阿儒)時間16年前 (2009/08/04 21:17), 編輯推噓1(107)
留言8則, 1人參與, 最新討論串1/4 (看更多)
之前沒有聽過有viewDidUnload這個delegate, 似乎是3.0才冒出來的東西, 對其的使用時機不是很清楚。 Apple原始的註解為 // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; 似乎是只有用在界面上的outlet需要設為nil, 而保存資料用的NSArray等不需要。 但我看很多sample code,卻是將所有的class ivar全部設為nil。 因為我在Navigation Control時,是用傳遞物件的方式, 讓前後的view能夠交換資料, 很怕在這個地方設錯會出問題, 偏偏viewDidUnload似乎是在記憶體不夠時才會被呼叫, 現在根本沒辦法測。 另外, 設self.myOutlet = nil; 與 [self.myOutlet release]; 的差別為何呢? 在此能不能使用[self.myOutlet release];呢? 最後想再偷偷請教一下, 在custom table view cell時, 會先建立subview物件,再將此加入cell的subview中, 那這個subview需要呼叫release method嗎? 比方說 cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; UITextField *textField = [[UITextField alloc] initWithFrame: CGRectMake(10, 12, 280, 25)]; textField.clearsOnBeginEditing = NO; textField.returnKeyType = UIReturnKeyDone; textField.text = self.event; [textField setDelegate:self]; [cell.contentView addSubview:textField]; [textField release]; } 若有最後一行,會讓程式crash,crash原因為objc_msgsend, 我查到的意思是,可能是送訊息給已經被釋放的物件。 若將[textField release];註解掉, 便可正常work。 但這種情況在將UITextField改為UILabel卻不會發生, 另外我將最後一行改成textField=nil; 也是可以正常work。 想請教是什麼原因,謝謝! -- ▂▃▄▃▂ ◢ ˙ ˙ ▉▃ /喵喵~~~~ ◣╲ˍ ╱▎ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.126.4.1

08/04 22:09, , 1F
注意一下Apple的習慣,did代表事情已經做完了
08/04 22:09, 1F

08/04 22:10, , 2F
這意思是說,當ViewDidUnload時,unload的動作就已經做完了
08/04 22:10, 2F

08/04 22:10, , 3F
你不應該在裡面再call一次release
08/04 22:10, 3F

08/04 22:11, , 4F
設成nil只代表把原本指向物件的指標,改為指向nil
08/04 22:11, 4F

08/04 22:11, , 5F
不表示原本所用到的物件有做釋放的動作
08/04 22:11, 5F

08/04 22:13, , 6F
至於最後的問題,你要去查一下addsubView有沒有"消費"物件
08/04 22:13, 6F

08/04 22:14, , 7F
有的話就不用release,沒有的話就需要
08/04 22:14, 7F

08/04 22:14, , 8F
不過從結果看來,應該是有消耗掉
08/04 22:14, 8F
文章代碼(AID): #1AU3JFrN (MacDev)
文章代碼(AID): #1AU3JFrN (MacDev)