嘿 我正在添加一个UIViewcontroller作为我当前视图的子视图。有这样的东西:
[self.view addSubview:viewcontroller.view];
用户可以与添加的视图控制器进行交互,因此我不能在将视图添加为子视图后将其释放,对吧?
所以我想释放dealloc方法并在我的主视图控制器卸载时将它设置为viewDidUnload中的nil,对吗?
问题是,我每次都不会添加作为子视图添加的viewcontoller。所以问题是,如果将viewcontroller添加为子视图,如何将其添加为子视图,如何释放它。
很多! 塞巴斯蒂安
答案 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]
以返回此属性。询问返回的数组是否包含有问题的子视图,并且可以相应地发布。
但是,如果不知道更多,听起来你需要重新思考如何设置所有这些。