我在iOS编程方面相当新,我正在开发一个我正在开发的iPad应用程序的问题。 每次使用splitview的rootview中的单元格时,我都会使用splitview控制器将子视图添加到splitview的detailview。这很好,直到堆栈太高而我的内存耗尽。将新视图添加到堆栈后,如何释放上一个子视图? 或者有更好的方法来解决这个问题吗?
由于
答案 0 :(得分:0)
要从超级视图中删除视图:
[view removeFromSuperview];
superview将在那时释放视图。因此,如果superview是唯一具有拥有引用的actor,则视图将被释放。换句话说,这个:
[superview addSubview:view];
导致superview保留视图。因此,您经常会看到以下代码块:
view = [[ViewClass alloc] initWithFrame:frame]; // I own view
[superview addSubview:view]; // superview and I both own view
[view release]; // now only superview owns view;
// it'll be deallocated if
// superview ever relinquishes
// ownership
因此,只要视图保留在superview中,您现在就有一个指向视图的指针。因此,随后将removeFromSuperview
发布到其中是安全的,但在此之后使用视图显然是不安全的。视图对象仅存在于alloc / init和removeFromSuperview之间。被移除后它将被取消分配。
根据正常的Cocoa引用计数规则,以下几乎与alloc / init和后续版本的替代替换相同:
view = [ViewClass viewWithFrame:frame]; // view is an autoreleased object;
// the autorelease pool owns it
[superview addSubview:view]; // superview now owns view also
// the autorelease pool will relinquish ownership automatically, in the future...
如果你没有手动做任何事情来影响行为,只是在正常的runloop中,那么autorelease池中的东西在当前调用堆栈的生命周期内是安全的。在这种情况下,您将完全像在手动alloc / init示例中那样处理视图,可能只是为了保存一行代码并隐藏内存管理而进行更改。