3

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

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

[self removeFromSuperView ];

但是经过多次添加子视图并将其删除后,我的应用程序可能会崩溃,日志说它已被杀死。

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

4

3 回答 3

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

在上面的示例中,您可以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 的视图被卸载然后重新加载,就会发生这种情况。

于 2012-07-13T06:17:47.750 回答
2

你应该首先释放。“alloc”对应的是“release”,“addSubview”对应的是“removeFromSuperView”:保持平衡。

添加视图:

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

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

[myView removeFromSuperView];
于 2012-07-13T08:10:28.733 回答
0

看起来您正在将保留视图添加为子视图。它的父视图再次保留它。因此,当您单元格时,[self removeFromSuperView];它会从 superView 获取发布消息,但仍必须由创建者发布。

于 2012-07-13T06:06:29.370 回答