self removeFromSuperView不释放自己?

时间:2012-07-13 05:28:08

标签: iphone uiview crash

我动态地将子视图添加到另一个uiview;

在子视图中,单击按钮以通过以下方法返回:

[self removeFromSuperView ];

但是在曼尼时代添加了子视图并将其删除后,我的应用程序可能会崩溃,日志表示它已被杀死。

我发现调用[self removeFromSuperView]并没有释放自我。那么释放它的最佳方法是什么?

3 个答案:

答案 0 :(得分:4)

如果您在创建时保留UIView(或将其添加到数组中),则保留计数将增加。例如:

// Retain count is 1
UIView *myView = [[UIView alloc] initWithFrame:myFrame];

// Retain count is 2
[myParentView addSubview:myView];

// Retain count is 1 again
[myView removeFromSuperView];

在上面的示例中,如果视图立即添加为subView,则可以autorelease视图,如果是iVar,则可以在dealloc中将其释放。

编辑:(可以保留您的观点的其他原因)

// Retain count +1
[myArray addObject:myView];

// Retained in the setter created by the @synthesize directive
@property(nonatomic, retain) UIView *myView;

文档中声明保留该属性的任何其他内容。

如果确实要释放它们,还应该注意在VC的loadView方法中创建对象,因为在调用loadView时它们会再次创建。如果VC的视图被卸载然后重新加载,就会发生这种情况。

答案 1 :(得分:2)

你应该先发布。 “alloc”的对应部分是“release”,“addSubview”的对应部分是“removeFromSuperView”:保持这些平衡。

添加视图:

UIView *myView = [[UIView alloc] initWithFrame:myFrame];
[myParentView addSubview:myView];
[myView release];

删除视图(removeFromSuperView后视图将在内存中清除):

[myView removeFromSuperView];

答案 2 :(得分:0)

您似乎将保留的视图添加为子视图。它的父视图再次保留了它。 因此,当您单元格[self removeFromSuperView];时,它会从superView获取释放消息,但仍然必须由创建者释放。