将按钮添加为子视图时,为什么会出现内存泄漏?

时间:2010-02-22 19:04:13

标签: iphone uikit uitableview uibutton instruments

我有一个使用tableview的应用程序,以及我作为子视图添加到每个自定义单元格的UIButton,如下所示:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

    checkButton = [[UIButton buttonWithType:UIButtonTypeCustom] initWithFrame:CGRectMake(2.0, 2.0, 40.0, 40.0)];
    [cell.contentView addSubview:checkButton];

    // lot's of other code

    return cell;
}

我认为一切正常,直到我开始使用Instruments来确保我没有任何内存泄漏,但我发现将UIButton添加为单元格的子视图就像在某种程度上导致UIKit中的泄漏。 / p>

具体来说,我每个单元格行都会出现内存泄漏(每次按钮被添加为子视图),泄漏的对象是“CALayer”,负责的框架为“ - [UIView _createLayerWithFrame:]”。 / p>

我在这里做错了吗?

3 个答案:

答案 0 :(得分:5)

代码[UIButton buttonWithType]方法已包含initWithFrame方法。您只需使用CGRectMake,然后设置按钮的框架。

rectangle = CGRectMake(2.0f,2.0f,40.0f,40.0f);
checkButton = [UIButton buttonWithType:UIButtonTypeCustom];
checkButton.frame = rectangle;

答案 1 :(得分:0)

您是否已在物理设备模拟器上对此进行了测试?

与实际设备代码相比,已知模拟器具有一些内存管理变化。 您应该始终在真实设备上运行内存泄漏测试。

否则,您的代码对我来说是正确的。

答案 2 :(得分:0)

checkButton是你班级的@property(保留)吗?

因为在这种情况下你应该在使用后将属性设置为null ...但是你不能因为单元格的细胞生命周期不在你的控制之下;你可以用局部变量做得更好。

另外,你应该在addSubview之后添加一个[checkButton release],因为addSubview代码是自己的retain / release