UITableView泄漏?

时间:2010-11-30 17:12:31

标签: iphone memory-management uitableview memory-leaks

我有一个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。按下按钮时,app会显示一个模态UINavigationController,而UINavigationController包含一个UITableViewController。

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

取消注释四行时,Leaks仪器显示以下内容:

Screenshot of Leaks Instrument

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

可能出现什么问题?

5 个答案:

答案 0 :(得分:2)

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

或者更好的是,全部清洁 - >建立和分析,告诉我们你看到了什么

答案 1 :(得分:1)

如果self.tableview已经存在,您不想再次初始化它。要么初始化一次(我猜你已经做了,可能是从笔尖加载)然后如果需要的话,在这里重置框架。

或者只是在这里分配/初始化tableview。

答案 2 :(得分:1)

也许您可以尝试将uiBarButtonItem定义为变量,然后将其分配给导航左栏按钮项,然后释放按钮

你有没有尝试过build&在Build菜单下分析?使用2.0 Objective C语句非常准确

另外,你必须小心使用属性定义,你使用self.tableView,我假设你有类似@property(非原子,保留)的东西?在这种情况下,一旦你分配,你应该释放物业在下一行..

最后,这一行非常奇怪:[self.tableView initWithFrame:self.tableView.frame style:UITableViewStyleGrouped];您正在尝试初始化已初始化的表,因为如果不这样做,self.tableView.frame应该是错误的。除此之外,initWithFrame方法返回未分配的内容。我认为您可以考虑更好的方法来执行此操作

对于这个烂摊子很抱歉,我一直在聊天中回答这个问题,但不幸的是你们已经断开连接了。

希望这有帮助。

答案 3 :(得分:1)

正如其他答案所指出的,你的问题就在于:

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

它将创建一个新的UITableView对象,它将修改self.tableView,这意味着该行完全没有意义。它只会造成您遇到的泄漏。删除它,你应该没事。

答案 4 :(得分:0)

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

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

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