【问题标题】:objective C (iphone) question about releasing关于发布的目标 C (iphone) 问题
【发布时间】:2010-09-09 00:02:10
【问题描述】:

如果我创建一个视图,并将其添加为子视图并将其添加到数组中,我是否必须释放它两次?

    UIView* cat = [[UIView alloc] initWithFrame:someFrame];
    [self.view addSubview:cat];
    [self.animals addObject:cat];
    [cat release];
    [cat release];

我觉得有 2 个发布声明很奇怪,而且我还没有看到有人这样做。但是在这种情况下,保留计数不会增加 2 吗?

【问题讨论】:

    标签: iphone objective-c memory-management


    【解决方案1】:

    您应该只有一个 release — 以平衡 allocaddSubView:addObject: 都不给调用者对对象的所有权,因此调用者不需要用release 来平衡它们。阅读memory management guide 应该会为您解决所有这些问题。

    记住“NARC”可能会有所帮助——如果你在一个包含单词“new”、“alloc”、“retain" 或 "copy",你需要释放它。正如您在上面的代码中看到的,只有 alloc 符合要求。由于您只对其进行了一次 NARC,因此您只需发布一次。

    【讨论】:

      【解决方案2】:

      除了查克写的:

      不是因为addSubview:addObject: 可能/可能不会增加保留计数。

      这是完全错误的看待它的方式。如果self.viewretains 你的对象,正确释放它是self.view 的责任,这不是你应该关心的。

      因为你创建了对象alloc你需要释放它。

      【讨论】:

        【解决方案3】:

        当猫被添加到self.view,那么self.view就拥有了猫,它负责释放猫。这与 self.animals 相同。 self.animals 拥有猫。当 self.animals 被释放时,它会释放它拥有的所有对象。

        所以,你应该只释放一只猫。因为在您的代码块中,您只拥有一只猫,而不是两只。

        【讨论】:

        • 好的,接着问一个问题——self.animals = nil 会放猫吗?
        • 我假设你的动物是 NSArray 的结构。当动物数组被释放时,数组内的所有对象都会收到释放消息。所以,动物中的猫将被释放。
        【解决方案4】:

        如前所述,您不必释放它两次;只需一次。但是,如果您使用自动释放,则根本不必释放它:

        UIView* cat = [[[UIView alloc] initWithFrame:someFrame] autorelease];
        [self.view addSubview:cat];
        [self.animals addObject:cat];
        

        猫对象将在 RunLoop 循环结束时释放。使用 autorelease 将使您的代码更简洁,更能应对变化。

        此外,除非您想将它们与本地范围的对象区分开来,否则您不需要视图和动物的自限定符(将本地范围的变量命名为与类的成员相同的名称也是不好的做法)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多