关于发布的客观C(iphone)问题

时间:2010-09-09 00:02:10

标签: iphone objective-c memory-management

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

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

我有两个发布声明似乎很奇怪,我没有看到人们这样做。但在这种情况下保留计数不会增加2吗?

4 个答案:

答案 0 :(得分:8)

您应该只有一个release - 以平衡allocaddSubView:addObject:都不会授予调用者对该对象的所有权,因此调用者无需使用release来平衡它们。阅读memory management guide应该清除这一切。

记住“NARC”可能会有所帮助 - 如果你在一个包含“ n ew”,“ a lloc”,“<强> r 获得“或” c opy“,你需要释放它。正如您在上面的代码中所看到的,只有alloc符合要求。由于你只需要一次NARCed,你只需要释放一次。

答案 1 :(得分:3)

除了Chuck所写的内容:

并非您发布,因为 addSubview:addObject: 可能/可能不会增加保留计数。

看待它是完全错误的方式。如果self.view retain是您的对象,则self.view有责任正确释放它,而您无需关心。

因为您通过 alloc 创建了对象,因此需要将其发布。

答案 2 :(得分:2)

当cat被添加到self.view中时,self.view拥有该cat,它负责释放cat。它与self.animals相同。 self.animals拥有猫。当self.animals被释放时,它将释放它拥有的所有对象。

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

答案 3 :(得分:0)

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

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

cat对象将在RunLoop循环结束时释放。使用自动释放将使您的代码更清晰,更能应对变化。

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