2011-05-27 136 views
1

嘿, 我添加一个UIViewcontroller作为我当前视图的子视图。随着类似的东西:发布UIViewController(如果可用)

[self.view addSubview:viewcontroller.view]; 

用户可以与添加视图 - 控制,所以我不能只是释放后,我加入它的视图我的子视图,右互动?

所以我想释放它的dealloc方法,并将其设置为无viewDidUnload时,我的主viewcontroller获取卸载,对不对?

问题是,作为子视图添加的viewcontoller不会每次都添加。所以问题是,如果视图控制器被添加为子视图,如何才能停止,如果是的话,释放它。

Thx很多! 塞巴斯蒂安

回答

2

你可以检查它像这样:

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

是的u需要把这个在你的dealloc方法。

+0

Thx对于大家的快速帮助很多。 Suny是第一个......我知道有一个简单的解决方案,像往常一样:) – wolfrevo 2011-05-27 08:11:11

+1

你可以省略'if(viewController)'检查,因为在ObjC中,你可以发送消息给零对象没有问题。 – sergio 2011-05-27 08:14:37

+0

是的,我知道消息发送到零对象,但在这种情况下,我需要进行检查,因为如果开发人员没有分配零视图控制器,那么它会占用一些垃圾值,然后发送任何消息垃圾值将导致痛苦的崩溃..至少这是我所知道的..cheers ..! – Suny 2011-05-30 04:26:46

1

在我曾经贡献的一些开源代码中,我们有一个叫做RELEASE_TO_NIL的宏,它完全是这样做的。

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

你会使用这样的:

RELEASE_TO_NIL(viewController); 

这么简单。

0

只需向viewController.view添加一个标签并测试self.view是否包含该标签。

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

根据苹果的文档,一个UIViewController实例应管理该填满整个画面的图。如果您的视图不能填充屏幕,您可以继承UIView以处理委派或使超视图作为委托来工作。

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

但是,不知道更多,它听起来像你需要重新考虑你如何设置所有这一切。

2

如果你正确读取你的代码:

[self.view addSubview:viewcontroller.view]; 

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

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

因此,你可以简单地去释放你的viewController-dealloc像往常一样:

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

,并在您viewControllerdealloc你需要释放管理视图,如果手动分配它(或者是任何一个如果需要,您的控制器可以释放其视图)。另一方面,只要您的superview被释放,那么您作为子视图添加的视图也将被释放(按照苹果规格的addSubview行为)。所以这里没什么好担心的。只需正确释放viewController(并使视图控制器正确管理它自己的视图)。

还有一点注意:你不应该在viewDidUnload中释放你的视图控制器。