0

在 Objective-C 中编程对象时,我有一个小问题。我有一个几乎完整的应用程序,一切正常。我的问题是我将我的对象设置为 nil 并在适当的时候释放它们。

但这是否足够,或者我应该何时何地使用 removefromsuperview?

在将 UIButton 添加到 UITableViewCell 的情况下,我使用以下代码添加 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

4 回答 4

5
buttonReset = nil;
[buttonReset release];

这没有意义。您设置一个指向nil(空指针)的指针,然后向它发送一条消息。在大多数其他语言中,这将导致崩溃。在 Objective-C 中是允许的,但什么都不会发生。您必须release在设置为nil. 但是在这种情况下你不应该这样做,因为buttonReset它是一个自动释放的对象(你没有使用 alloc/init 来创建它),所以你不拥有它,因此你不能释放它。

removeFromSuperview在这种情况下,您也不必使用。您将一个按钮(一个子视图)添加到您的单元格(超级视图)。超级视图将持有按钮的强(保留)引用。然后释放单元格时,它还将处理其所有子视图。您只需要在您真正想要这样做时自己删除它,而不是出于内存管理的原因。

如果您还不知道它,您可能需要考虑在将来使用自动引用计数 (ARC)

于 2013-04-02T14:44:10.013 回答
2

不,您不应该调用[buttonReset removeFromSuperview];,至少不应该立即调用:如果这样做,按钮将从屏幕上消失(鉴于方法的名称,这应该不足为奇)。此外,您无需将按钮设置为nil

removeFromSuperview当您需要从屏幕上删除控件时需要调用。如果您也释放它,则代表您的控件的对象将被销毁。例如,如果您以编程方式为特定任务添加了一个按钮,并且必须在任务完成后删除该按钮,则调用removeFromSuperview是合适的。

于 2013-04-02T14:42:25.873 回答
0

调用removeFromSuperview视图会导致它从其父视图中移除。这将使目标视图及其包含的所有视图从屏幕上消失。

在您的情况下,我只需将对象设置为 nil 并完成它。

看看removefromsuperview 是否释放了滚动视图的对象?.

里面有有趣的信息。

但值得深入挖掘,因为它是 ObjC 中一个非常重要的概念。你永远不应该在你没有显式或隐式保留的对象上调用 -release(通过调用三个魔术词之一)。您不会调用 -release 来释放对象。你调用它来释放你对对象的持有。scrollview 是否保留其子视图不是您的事(它确实保留了其子视图,但仍然不是您的事)。-removeFromSuperview 是否调用 -release 也不是你的事。那是在滚动视图和它的子视图之间。重要的是,当你关心对象时你保留它们,当你不再关心它们时释放它们,让系统的其余部分负责保留和释放它关心的东西。

于 2013-04-02T16:24:47.503 回答
-2

你应该只使用

[buttonReset removeFromSuperview];

接着

buttonReset = nil;

正如苹果所说

如果接收者的 superview 不为零,则 superview 释放接收者。如果您打算重用视图,请确保在调用此方法之前保留它,并在以后酌情再次释放它。

UIView 参考

于 2013-04-02T14:41:44.457 回答