内存泄漏在哪里?

时间:2010-11-16 08:17:06

标签: objective-c cocoa-touch ios4

我正在使用以下代码向tableHeaderView添加自定义视图:

imageButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    imageButton.frame = CGRectMake(120, 12, 64, 64);
    imageButton.titleLabel.font = [UIFont systemFontOfSize:10];
    imageButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
    imageButton.titleLabel.textAlignment = UITextAlignmentCenter;
    [imageButton setTitle:NSLocalizedString(@"Choose\nPhoto", @"Choose\nPhoto") forState:UIControlStateNormal];
    [imageButton addTarget:self action:@selector(photoButtonPressed) forControlEvents:UIControlEventTouchUpInside];

    // add existing image, if any, to button
    if (child.thumbnailImage != nil) {
        [imageButton setBackgroundImage:child.thumbnailImage forState:UIControlStateNormal];
    }

    // add button to view
    self.headerView = [[UIView alloc] initWithFrame:CGRectMake(22, 12, 70, 70)];
    [headerView addSubview:imageButton];

    // add view to table header
    self.tableView.tableHeaderView = headerView;

内存泄漏显示在headerView UIView的上面的alloc行上。 我在头文件中声明UIView和UIButton并在ViewDidUnload和dealloc中释放它,所以我不确定我做错了什么。 此外,这只出现在设备而不是模拟器上(我想提到过)。

任何帮助都将不胜感激。

谢谢,

1 个答案:

答案 0 :(得分:1)

您正在使用headerView setter方法(self.headerView),因此您需要使用releaseautorelease释放分配给headerView属性的UIView实例。

e.g。

UIView* newHeaderView = [[UIView alloc] initWithFrame...];
self.headerView = newHeaderView;
[newHeaderView release];

self.headerView = [[[UIView alloc] initWithFrame:...] autorelease];

原因是headerView setter方法自动保留分配给它的对象。

或者,您可以直接设置headerView实例变量,而无需使用属性setter方法:

[headerView release]; // release any existing object
headerView = [[UIView alloc] initWithFrame:...];