如果我创建一个视图,并将其添加为子视图并将其添加到数组中,我是否必须将其发布两次?
UIView* cat = [[UIView alloc] initWithFrame:someFrame];
[self.view addSubview:cat];
[self.animals addObject:cat];
[cat release];
[cat release];
我有两个发布声明似乎很奇怪,我没有看到人们这样做。但在这种情况下保留计数不会增加2吗?
答案 0 :(得分:8)
您应该只有一个release
- 以平衡alloc
。 addSubView:
和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循环结束时释放。使用自动释放将使您的代码更清晰,更能应对变化。
此外,您不需要在视图和动物上使用自我限定符,除非您想要将它们与本地范围的对象区分开来(使用与您的类成员命名相同的本地范围变量也是不好的做法)。