【问题标题】:Why does Apple create its views this way为什么 Apple 会以这种方式创建视图
【发布时间】:2010-04-30 21:49:59
【问题描述】:
希望从另一篇文章中修复我的一个错误,我想知道为什么苹果会写这个(以 Elements 为例)
UIView *localContainerView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.containerView = localContainerView;
[localContainerView release];
而不是更简单的方法:
containerView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
?
【问题讨论】:
标签:
iphone
cocoa-touch
uiview
【解决方案1】:
self.containerView = 实际上是[self setContainerView:],它通常会在分配新值之前释放任何先前的值。当您直接分配时,您必须知道该成员没有持有对任何内容的引用,例如因为您刚刚释放它或检查了 nil 值。
[self setContainerView:] 还可以处理任何额外的处理。
【解决方案2】:
好吧,鉴于您演示的“更简单的方法”可能会导致完美的优化代码或相当不幸的内存泄漏,因此很难回答这个问题!
正如 Drawnonward 所指出的,设置 self.containerView 与调用 [self setContainerView:] 相同,如果您使用 @synthesize 生成 getter 和 setter,您的 setContainerView: 方法将如下所示:
- (void)setContainerView:(UIView *)view {
if (containerView != view) {
[view retain]
[containerView release];
containerView = view;
}
}
如您所见,这些 setter 为您处理所有内存管理,因此我认为 Apple 喜欢鼓励开发人员利用这一点。
当然,如果您非常清楚自己的指针和引用计数,那么直接设置 containerView 绝对没有问题,正如您所演示的那样。
编辑:您可以在一行代码中完成您想要做的事情,同时还可以使用您的 setter 来简化内存管理,具体如下:
self.containerView = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] autorelease];