作者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