我什么时候使用removeFromSuperview?

时间:2013-04-02 14:36:56

标签: ios objective-c

在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];

在这种情况下?

4 个答案:

答案 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;
苹果说

  

如果接收者的超级视图不是nil,则superview释放接收者。如果您打算重用视图,请务必在调用此方法之前保留它,并在适当的时候再次将其释放。

UIView Referance

中的