ARC从方法最佳实践返回对象(获取内存泄漏警告)

时间:2012-01-08 18:49:58

标签: objective-c automatic-ref-counting

我在xcode 4.2中创建了一个示例项目,并注意到新项目是使用ARC设置的。

我有一个如下所示的方法。以前,我会在方法中自动释放单元格,让调用者的表视图保留单元格。使用ARC,无法自动释放,

- (UITableViewCell*) getCellForIndex:(int)index {

    UITableViewCell *cell =         
        [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];

    if (index == 0)
        cell.textLabel.text = profileToUse.name;
    if (index == 1)
        cell.textLabel.text = profileToUse.sex;
    if (index == 2)
        cell.textLabel.text = profileToUse.city;
    return cell;
}

当我在上面的代码上运行分析工具时,它表示对象'cell'存在潜在的内存泄漏。

如何使用ARC编写上述内容,以便分析警告消失?我做错了什么?

感谢。

2 个答案:

答案 0 :(得分:5)

尝试将方法重命名为-cellForIndex:,“get”-prefixed方法在Cocoa中具有不同的隐含行为。

(另外,也许-cellAtIndex:为了与NSArray等一致......)

答案 1 :(得分:4)

你的方法getCellForIndex:分配并返回一个对象,这样它就像一个直的alloc(实际上你的代码只是alloc并进行了一些初始化)。

由于ARC在调用方法时没有看到方法的实际实现,因此必须对返回对象的所有权做出假设,并且假设所有权转移。在编译实施时,ARC会注意到您的代码违反了此假设并向您发出警告。

可以通过在@interface@implementation中为您的方法添加显式属性来覆盖该假设:

- (UITableViewCell*) getCellForIndex:(int)index __attribute((ns_returns_retained))

ARC现在知道对象所有权已转移。 allocnew等系列中的方法会自动添加此属性。正如其他回复建议您最好重命名方法一样,newCellForIndex:可能适合此处,new用于allocinit的组合,这就是您的方法确实

BTW:改变你的第二个&第三个ifelse if会使您的算法更清晰(并且速度稍快,但这不是理由)。

评论中的问题:

ARC确实引入了新的属性等,但也使用推理和默认值,这样如果你遵循正常的Cocoa约定,你就不应该经常使用它们 - 当然YMMV ......除了Apple的文档,你还可以找到描述{ {3}}