为什么Apple以这种方式创建其视图

时间:2010-04-30 21:49:59

标签: iphone cocoa-touch uiview

希望从另一个帖子修复我的错误,我想知道为什么苹果写这个(为它的元素示例)

UIView *localContainerView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.containerView = localContainerView;
[localContainerView release];

而不是更简单的方法:

containerView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];

2 个答案:

答案 0 :(得分:3)

self.containerView =实际上是[self setContainerView:],它通常会在分配新值之前释放任何先前的值。直接分配时,您必须知道该成员没有持有对任何内容的引用,例如,因为您刚刚发布它或检查了nil值。

[self setContainerView:]也可以处理任何其他处理。

答案 1 :(得分: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];