作者zonble (zonble)
看板MacDev
标题Re: [问题] 如何取空白可画图的大小?
时间Tue Dec 28 04:13:18 2010
: 推 dm4:请问一下 zonble 大,文中的这个 scrollView 如果放在 12/26 15:32
: → dm4:viewDidLoad 的时候再 add 会有什麽差别吗? 12/26 15:32
整个解释一遍好了。UIViewController 与其所属的 view 之间
的关系,是所谓的 Lazy Loading-在 UIViewController 经过
alloc、init 之後,并不会马上产生 view 这个物件,而是第一
次呼叫到 view,才去产生 view。根据 UIViewController 所表
现的行为,我们可以知道,苹果的实作大概是这样:
@implementation UIViewController
....
- (UIView *)view
{
if (!_view) {
[self loadView];
if (_view) {
[self viewDidLoad];
}
}
return _view;
}
- (void)setView:(UIView *)inView
{
[_view release];
_view = [inView retain];
if (!_view) {
[self viewDidUnload];
}
}
我们有两种不同的方式载入 view,一种是透过 nib 载入,另外
一种则是用程式产生。官方文件的规范是,如果你要载入 nib,
就不要改写 loadView,让 UIViewController 原本实作的 loadView
载入 nib,而你对 nib 载入的 view 还想做什麽事情,就写在
viewDidLoad 里头。
而如果要自己用程式产生 self.view,那麽,官方就要求你改写
loadView,而且不要呼叫 [super loadView]。实际上,如果没有 nib,
却呼叫了 [super loadView],还是会给你一个空白的 view;会动,
但是不好-因为根本就不需要载入 nib,呼叫 super,却会让程式
走到看看有没有 nib 要载入那段,其实是多此一举。这时候写在
loadView 与 viewDidLoad 的差别不大。
有件事情很重要:什麽时候要去 release scrollView。由於
UIViewController 不只是在 dealloc 的时候会去 release view,
而是在收到记忆体不足警告的时候,不在前景的 view controller,
都会把 view 放掉,而当这个 view controller 回到前景时,再
透过 Lazy Loading,重新产生 view 物件。所以,像 scrollView
这种会在 loadView 产生的物件,不但要在 view controller dealloc
的时候 release,在 viewDidUnload 的时候也要 release,以避免
因为记忆体警告发生时,重复在 loadView 中产生新的 scrollView,
而造成 memory leak。
--
zonble.net
cocoa.zonble.net
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.44.182.144
1F:推 dm4:感谢 zonble 大! 12/28 12:16
2F:推 popcorny:好文章..推!! 12/28 14:26
3F:→ seedman:原来如此! 12/29 18:14