希望从另一个帖子修复我的错误,我想知道为什么苹果写这个(为它的元素示例)
UIView *localContainerView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.containerView = localContainerView;
[localContainerView release];
而不是更简单的方法:
containerView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
答案 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];