我在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编写上述内容,以便分析警告消失?我做错了什么?
感谢。
答案 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现在知道对象所有权已转移。 alloc
,new
等系列中的方法会自动添加此属性。正如其他回复建议您最好重命名方法一样,newCellForIndex:
可能适合此处,new
用于alloc
和init
的组合,这就是您的方法确实
BTW:改变你的第二个&第三个if
到else if
会使您的算法更清晰(并且速度稍快,但这不是理由)。
评论中的问题:
ARC确实引入了新的属性等,但也使用推理和默认值,这样如果你遵循正常的Cocoa约定,你就不应该经常使用它们 - 当然YMMV ......除了Apple的文档,你还可以找到描述{ {3}}