【问题标题】: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];
      

      【讨论】:

        猜你喜欢
        • 2014-08-28
        • 1970-01-01
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 2021-07-19
        • 1970-01-01
        • 1970-01-01
        • 2013-08-23
        相关资源
        最近更新 更多