释放UIViewController(如果可用)

时间:2011-05-27 07:38:06

标签: iphone ios memory-management uiviewcontroller subview

嘿 我正在添加一个UIViewcontroller作为我当前视图的子视图。有这样的东西:

[self.view addSubview:viewcontroller.view];

用户可以与添加的视图控制器进行交互,因此我不能在将视图添加为子视图后将其释放,对吧?

所以我想释放dealloc方法并在我的主视图控制器卸载时将它设置为viewDidUnload中的nil,对吗?

问题是,我每次都不会添加作为子视图添加的viewcontoller。所以问题是,如果将viewcontroller添加为子视图,如何将其添加为子视图,如何释放它。

很多! 塞巴斯蒂安

5 个答案:

答案 0 :(得分:2)

您可以这样检查:

if(viewController)     
{
 [viewController release];
 viewController=nil;
}

是的,你需要把它放在你的dealloc方法中。

答案 1 :(得分:2)

如果您正确阅读了您的代码:

[self.view addSubview:viewcontroller.view];

它不是作为子视图添加的控制器,而是它管理的视图。

这一点很重要,因为这意味着控制器本身不会被保留。保留的是视图。

因此,您可以像往常一样继续在viewController中发布-dealloc

 -(void)dealloc {
     [viewController release]; viewController = nil;
     ...
 }

并且在您的viewController dealloc中,如果您手动分配了托管视图(或者在控制器发布视图的情况下,如果需要,则需要释放托管视图)。

另一方面,每当您的superview被取消分配时,您添加的子视图视图也将被释放(根据Apple规范的addSubview行为)。所以在这里无需担心。只需正确释放viewController(并使视图控制器正确管理自己的视图)。

还有一点需要注意:您不应该在viewDidUnload中发布视图控制器。

答案 2 :(得分:1)

在我曾经做过的一些开源代码中,我们有一个名为RELEASE_TO_NIL的宏,它完全符合这一点。

#define RELEASE_TO_NIL(obj) if(obj != nil) { [obj release]; obj = nil; }

您可以这样使用它:

RELEASE_TO_NIL(viewController);

这很简单。

答案 3 :(得分:0)

只需向viewController.view添加标记,并测试self.view是否包含该标记。

UIView *testView = [self.view viewWithTag:yourTag];
if(testView!=nil){
   doStuff;
}

答案 4 :(得分:0)

根据Apple文档,UIViewController实例应该管理一个填满整个屏幕的视图。如果您的视图没有填满屏幕,您可以将UIView子类化为处理委派或使superview作为委托工作。

此外,视图的子视图包含在NSArray的实例中,执行[myView subviews]以返回此属性。询问返回的数组是否包含有问题的子视图,并且可以相应地发布。

但是,如果不知道更多,听起来你需要重新思考如何设置所有这些。