在Objective-C中编写对象时,我有一个小问题。我有一个即将完成的应用程序,一切正常。我的问题是我将对象设置为nil并在适当的时候释放它们。
但这是否足够,或者我应该何时何地使用removefromsuperview?
在向UITableViewCell添加UIButton的情况下,我使用以下代码添加UIButton:
UIButton *buttonReset = [UIButton buttonWithType:UIButtonTypeContactAdd];
buttonReset.frame = CGRectMake(250.0f, 7.0f, 75.0f, 30.0f);
[cell addSubview:buttonReset];
buttonReset addTarget:self action:@selector(resetSettings) forControlEvents:UIControlEventTouchUpInside];
buttonReset = nil;
[buttonReset release];
我是否还需要使用
[buttonReset removeFromSuperview];
在这种情况下?
答案 0 :(得分:5)
buttonReset = nil;
[buttonReset release];
这没有意义。您设置指向nil
(空指针)的指针,然后向其发送消息。在大多数其他语言中,这将导致崩溃。在Objective-C中允许,但不会发生任何事情。在设置为release
之前,您必须nil
。但是在这种情况下你不应该这样做,因为buttonReset
是一个自动释放的对象(你没有使用alloc / init来创建它),所以你不拥有它,因此你不能释放它。
在这种情况下,您也不必使用removeFromSuperview
。您向单元格(超级视图)添加一个按钮(子视图)。超级视图将保留按钮的强大(保留)参考。当该单元格随后被释放时,它也将处理其所有子视图。您只需要在实际执行此操作时自行删除它,但不是出于内存管理原因。
如果您还不知道,可能会考虑将来使用Automatic Reference Counting (ARC)。
答案 1 :(得分:2)
不,你不应该至少不立即打电话给[buttonReset removeFromSuperview];
:如果你这样做,按钮会从屏幕上消失(给定方法的名称,这应该不足为奇)。此外,您无需将按钮设置为nil
。
当您需要从屏幕上删除控件时,需要调用removeFromSuperview
。如果你也释放它,代表你的控件的对象将被销毁。例如,如果您以编程方式为特定任务添加了按钮,并且在完成任务后必须删除该按钮,则调用removeFromSuperview
是合适的。
答案 2 :(得分:0)
在视图上调用removeFromSuperview
会导致其从超级视图中删除。这将使目标视图从屏幕上消失,并包含其包含的所有视图。
在你的情况下,我只是将对象设置为nil并完成它。
请参阅does removefromsuperview releases the objects of scrollview?。
其中有一些有趣的信息。
但值得深入研究,因为它非常重要 ObjC中的概念。你永远不应该在你的对象上调用-release 没有 - 明确地或隐含地(通过调用三个中的一个) 魔术词)。你不要调用-release来解除分配 宾语。你调用它来释放你放在对象上的保持。 scrollview是否保留其子视图不是您的业务(它 确实保留了它的子视图,但它仍然不是你的业务)。是否 -removeFromSuperview调用-release也不是你的业务。这是在scrollview及其子视图之间。重要的是你 在关心它们时保留对象,并在停止时释放它们 照顾他们,并让系统的其余部分照顾 保留并释放它所关心的东西。
答案 3 :(得分:-2)
你应该只使用
[buttonReset removeFromSuperview];
然后
buttonReset = nil;
苹果说
UIView Referance 中的如果接收者的超级视图不是nil,则superview释放接收者。如果您打算重用视图,请务必在调用此方法之前保留它,并在适当的时候再次将其释放。