2010-08-30 52 views
0

我的印象是,添加一个子视图视图是这样下:Objective-C的addSubView保留计数

UITableViewController *sitesel = [[UITableViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
sitesel.view.frame = CGRectMake(0,0,100,100); 
[self.left addSubview:sitesel.view]; 
[sitesel release]; 

但好像我不应该放开sitesel(控制器)? 因此,我应该释放视图或什么,我有这个保留的东西钉了一会儿,但它滑倒。 (和使用的TableView,你有子类的UITableViewController吧?)

(self.left是self.view的子视图,在笔尖添加)

回答

1

addSubview确实能保留的观点,这不是问题。你的问题是视图的控制器稍后会消失。

您不应该发布视图,因为这不关你的事。你没有创造它,你没有触及它。不要管它。

为了保持正常工作,它需要保持连接到一个有效的控制器。因此,您不得释放控制器,但请保持它。在释放控制器之前添加一个属性,如@property(retain) UITableViewController *siteController;,然后执行self.siteController = sitesel;。这样一切都留在记忆中。 PS:为了保持清洁,您应该更改sitesel的访问器中的视图。只是为了确保它总是来控制器。然后,您的方法会变得更短,只需设置控制器即可。

新增:这二传手能像她那样,要求您仅设置控制器和视图被透明的更新:然后

- (void)setSiteselController:(UITableViewController *)ctrl { 
    if (_sitesel) 
    [_sitesel.view removeFromSuperview]; 

    [_sitesel autorelease]; 
    _sitesel = [ctrl retain]; 

    if (_sitesel) { 
    _sitesel.view.frame = CGRectMake(0,0,100,100); 
    [self.left addSubview: _sitesel.view]; 
    } 
} 

您的原始代码将收缩到这么多的清洁版本:

UITableViewController *sitesel = [[UITableViewController alloc] initWithStyle: UITableViewStyleGrouped]; 
self.siteselController = sitesel; 
[sitesel release]; 

PPS:你不需要需要 UITableView工作的控制器。这简单得多!

+0

对不起,你可以扩展你的PS,我不太明白。但是我不需要再次访问UITableViewController,从这一点开始的所有事情都是在TableViewController中完成的。 – 2010-08-30 13:41:05

+0

您应该重写访问器并在其中添加视图。像这样:'_controller = newController; _controller.view.frame = ... [self.view addSubview:_controller.view];' 你不需要控制器在这里并不重要。如果你不这样做,你必须保留它。你也许可能想在稍后删除/交换该视图。然后,为了不浪费内存,了解控制器是很好的。 – 2010-08-30 13:48:09

+0

对不起,我还是不明白,我没有看到你刚刚发布的代码有任何不同。 – 2010-08-30 20:41:40