【问题标题】:UITableView leaking?UITableView 泄漏?
【发布时间】:2011-05-18 00:25:18
【问题描述】:

我有一个 UITableViewController,我在 viewDidLoadMethod 中设置了一些属性,如下所示:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self.parentViewController.parentViewController action:@selector(dismissSettings)] autorelease];
    [self setTitle:@"Gabbai Settings"];

    //Set up the table 
    [self.tableView initWithFrame:self.tableView.frame style:UITableViewStyleGrouped];

    [self.tableView setRowHeight:65.0];
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLineEtched];

    [self.tableView.backgroundView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@_settings", kTheme] ofType:@"png"]]]];


}

应用显示一个 UIScrollViewController 和一个 UIButton。当按下按钮时,应用会显示一个模态 UINavigationController,并且该 UINavigationController 包含一个 UITableViewController。

由于某种原因,当我显示 UITableViewController 时,Leaks 会报告一些泄漏。但是,如果我注释掉//Set up the table 之后的四行,一切都很好。

当取消注释四行时,Leaks 工具显示以下内容:

我不确定这里发生了什么,但这真的很烦人。我之前使用相同的四行代码来自定义我的 UITableViewController,这是一种新行为。

可能出了什么问题?

【问题讨论】:

    标签: iphone memory-management uitableview memory-leaks


    【解决方案1】:

    在你的 dealloc 方法中显式释放 tableView 看看会发生什么。

    或者更好,清理所有 -> 构建和分析,告诉我们你看到了什么

    【讨论】:

    • 感谢这个伟大的提示。它有时确实有效,但并非总是如此。
    • 如果我释放 tableView,下次我尝试加载它时它会崩溃。
    • Moshe 你需要发布更多代码才能有人帮助你。您向我们展示的是一个基本的对象保留问题。如果在那之后您仍然遇到问题,那么可能还有很多其他问题。
    【解决方案2】:

    正如其他答案所指出的,您的问题是:

    [self.tableView initWithFrame:self.tableView.frame style:UITableViewStyleGrouped];
    

    它将创建一个新的UITableView 对象,并且它不会修改self.tableView,这意味着该行完全没有意义。它只会造成您正在经历的泄漏。删除它,你应该没问题。

    【讨论】:

    • 如何改变表格视图的样式?
    • UITableView 创建时不能更改表格样式。您使用的是 NIB 和 Interface Builder 吗?然后你可以在那里改变风格。否则,您可以在loadView 中执行此操作,或者在使用initWithStyle: 创建UITableViewController 时执行此操作。
    【解决方案3】:

    如果 self.tableview 已经存在,你不想再次初始化它。要么初始化一次(我猜你已经这样做了,也许是从笔尖加载),然后如果需要,在此处重置框架。

    或者只是在这里分配/初始化表视图。

    【讨论】:

      【解决方案4】:

      也许你可以尝试将uiBarButtonItem定义为一个变量,然后将其赋值给导航左栏按钮项,然后释放按钮

      您是否尝试过在“构建”菜单下进行构建和分析?使用 2.0 Objective C 语句,它非常准确

      此外,你必须小心属性定义,你正在使用 self.tableView,我假设你有类似 @property(nonatomic, retain)? 的东西,在这种情况下,一旦你分配,你应该释放下一行的属性..

      最后,这一行极其诡异:[self.tableView initWithFrame:self.tableView.frame style:UITableViewStyleGrouped];你正在尝试初始化一个已经初始化的表,因为如果你不这样做,self.tableView.frame 应该是错误的。除此之外,initWithFrame 方法返回的东西没有被分配。我认为你可以想出更好的方法来做到这一点

      对不起,我一直在聊天中回答这个问题,但很遗憾你被断开了。

      希望这会有所帮助。

      【讨论】:

        【解决方案5】:

        看起来您有一个泄漏的数组或字典,而不是 tableview。

        您用来填充 tableview 的数组是什么?

        另外,你不会想[self.tableVIew initWithFrame, 试试[self.tableView setFrameCGRectMake(x,y,w,h)];

        【讨论】:

        • 我没有使用数组,我在 cellForRowAtIndex 方法中手动设置所有内容。
        • 嗯,根据你对 Leaks 的图片,泄漏的是某个地方的数组/字典。
        • 当我重新初始化 UITableView 时,它泄漏了旧的内容,因此 NSArray 泄漏。
        猜你喜欢
        • 1970-01-01
        • 2013-12-24
        • 1970-01-01
        • 2012-07-09
        • 2011-10-23
        • 2013-11-06
        • 2011-06-03
        • 2012-04-03
        • 1970-01-01
        相关资源
        最近更新 更多