objective -c addSubView保留计数

时间:2010-08-30 12:58:32

标签: objective-c uitableview retain

我的印象是在视图中添加子视图是这样的:

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 个答案:

答案 0 :(得分:1)

addSubview确实保留了视图,这不是问题所在。您的问题是视图的控制器稍后消失。

你不应该发布视图,因为这不关你的事。你没有创建它,你没有碰它。别管它了。

为了保持工作正常,它需要保持与有效控制器的连接。因此,你不能释放控制器,但要保持它。添加像@property(retain) UITableViewController *siteController;这样的属性,然后在释放控制器之前执行self.siteController = sitesel;。这样一切都留在了记忆中。

PS:为了清洁,您应该更改sitesel访问者中的视图。只是为了确保它始终来自控制器。然后,您的方法会更短,只需设置控制器。

ADDED:该setter可能看起来像这样,要求您只设置控制器并透明地更新视图:

- (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正常工作。这简单得多了!