方法返回具有+1保留计数的Objective-C对象

时间:2012-02-07 18:14:24

标签: objective-c memory-leaks

当我分析我的代码时,我开始了这些:

Method returns an Objective-C object with a +1 retain count

Object leaked: object allocated and stored into 'headerLabel' is not referenced later in this execution path and has a retain count of +1

这个方法:

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
    {
        // create the parent view that will hold header Label
        UIView* customView = [[UIView alloc] initWithFrame:CGRectMake(15.0, 0.0, 300.0, 44.0)];

        // create the button object
        UILabel * headerLabel = [[UILabel alloc] initWithFrame:CGRectZero];
        headerLabel.backgroundColor = [UIColor clearColor];
        headerLabel.opaque = NO;
        headerLabel.textColor = [UIColor whiteColor];
        headerLabel.highlightedTextColor = [UIColor whiteColor];
        headerLabel.font = [UIFont boldSystemFontOfSize:15];
        headerLabel.frame = CGRectMake(10.0, 0.0, 300.0, 44.0);

        if (section == 0)
            headerLabel.text = NSLocalizedString(@"A", @"A");
        else if (section == 1) 
            headerLabel.text =NSLocalizedString(@"B", @"B");
        else if (section == 2)
            headerLabel.text = NSLocalizedString(@"C", @"C");

        if(searching)
            headerLabel.text = NSLocalizedString(@"SEARCH", @"Search Results");

        [customView addSubview:headerLabel];

        return customView;
    }

现在,扩展我想要理解的箭头,并且我假设没有取消分配customView。是不是?

我该如何解决?我是新来的,帮助我理解!

3 个答案:

答案 0 :(得分:5)

添加

[headerLabel release];

[customView addSubview:headerLabel];

或像这样初始化

UILabel * headerLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];

当然,假设您没有使用ARC

答案 1 :(得分:1)

[customView addSubview:headerLabel];

在此行之后,您应该释放headerLabel变量。

  

理解对象所有权的概念很重要。在   目标C,对象所有者是具有的人(或代码)   明确说“对,我需要这个对象,不要删除它”。这个   可以是创建对象的人(或代码)   。或者它可能是另一个人(或代码)   收到了对象并需要它。   因此,对象可以拥有多个所有者。业主数量   对象有,也是引用计数。

看看这个Memory Management with Objective C / Cocoa / iPhone。 在您的代码中,您创建了headerLabel,因此您是该对象的所有者;你必须释放那个对象。

答案 2 :(得分:0)

应该发布headerLabel,如果你的方法创建了一个实例并保留了它,那么它的名字必须以" new"," copy"或"分配"