发布子视图

时间:2010-12-01 12:36:23

标签: iphone cocoa-touch uiview uiviewcontroller uisplitviewcontroller

我在iOS编程方面相当新,我正在开发一个我正在开发的iPad应用程序的问题。 每次使用splitview的rootview中的单元格时,我都会使用splitview控制器将子视图添加到splitview的detailview。这很好,直到堆栈太高而我的内存耗尽。将新视图添加到堆栈后,如何释放上一个子视图? 或者有更好的方法来解决这个问题吗?

由于

1 个答案:

答案 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示例中那样处理视图,可能只是为了保存一行代码并隐藏内存管理而进行更改。