首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >self removeFromSuperView不释放self?

self removeFromSuperView不释放self?
EN

Stack Overflow用户
提问于 2012-07-13 13:28:08
回答 3查看 4K关注 0票数 3

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

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

代码语言:javascript
复制
[self removeFromSuperView ];

但在manny times添加子视图并将其删除后,我的应用程序可能会崩溃,日志显示它已被终止。

我发现调用[self removeFromSuperView]并不能释放self。那么发布它的最好方法是什么呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-13 14:17:48

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

代码语言:javascript
复制
// 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,则可以在取消分配时将其释放。

EDIT:(保留视图的其他原因)

代码语言:javascript
复制
// Retain count +1
[myArray addObject:myView];

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

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

在VC的loadView方法中创建对象时也要小心,如果确实释放了这些对象,因为调用loadView时会再次创建这些对象。如果你的VC的视图被卸载然后重新加载,就会发生这种情况。

票数 4
EN

Stack Overflow用户

发布于 2012-07-13 16:10:29

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

添加视图:

代码语言:javascript
复制
UIView *myView = [[UIView alloc] initWithFrame:myFrame];
[myParentView addSubview:myView];
[myView release];

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

代码语言:javascript
复制
[myView removeFromSuperView];
票数 2
EN

Stack Overflow用户

发布于 2012-07-13 14:06:29

看起来您正在将保留视图添加为子视图。它的父视图又一次保留了它。所以当你计算[self removeFromSuperView];时,它会收到来自superView的释放消息,但仍然需要由创建者释放。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11464634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档