作者denru01 (阿儒)
看板MacDev
標題[問題] viweDidUnload該填的內容為何?
時間Tue Aug 4 21:16:59 2009
之前沒有聽過有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
1F:推 atst2:注意一下Apple的習慣,did代表事情已經做完了 08/04 22:09
2F:→ atst2:這意思是說,當ViewDidUnload時,unload的動作就已經做完了 08/04 22:10
3F:→ atst2:你不應該在裡面再call一次release 08/04 22:10
4F:→ atst2:設成nil只代表把原本指向物件的指標,改為指向nil 08/04 22:11
5F:→ atst2:不表示原本所用到的物件有做釋放的動作 08/04 22:11
6F:→ atst2:至於最後的問題,你要去查一下addsubView有沒有"消費"物件 08/04 22:13
7F:→ atst2:有的話就不用release,沒有的話就需要 08/04 22:14
8F:→ atst2:不過從結果看來,應該是有消耗掉 08/04 22:14