自动参考计数和完成

时间:2012-02-07 13:16:11

标签: ios automatic-ref-counting

快速提问:我使用了很多NSObject派生类,并且想知道如何正确清理可能拥有其他类实例的类属性(在下面的代码段中,这是一个自定义类实例的数组)。我对newfinalize的使用是否正确?

我的理解是new是一种方便的方法,它调用alloc和init,finalizedealloc之前调用 - 至少这是我从阅读文档中收集的内容。我有这个权利吗?

感谢您提供任何建议/最佳做法等等!

- (id)new {
waffleArray = [[NSMutableArray alloc] initWithCapacity:kCellCount];

    for (int i = 0; i < kCellCount;  i++) {
        WaffleCell * cell = [WaffleCell new];
        [waffleArray addObject:cell];
     }

    return self;
}

// clean up
- (void)finalize {

    [waffleArray removeAllObjects];
     waffleArray = nil;

    [super finalize];
}

1 个答案:

答案 0 :(得分:1)

new上的{p> NSObject是一个类方法,而不是您拥有的实例方法。另外,我真的不明白为什么你会超载new。重载init会更常见,例如:

- (id)init {
    if ((self = [super init])) {
        waffleArray = [[NSMutableArray alloc] initWithCapacity:kCellCount];

        for (int i = 0; i < kCellCount;  i++) {
            WaffleCell * cell = [WaffleCell new];
            [waffleArray addObject:cell];
        }
    }
    return self;
}

至于finalize,你真的不需要这样做。这就是Apple所说的:

  

垃圾收集器在处理它使用的内存之前在接收器上调用此方法。启用垃圾收集时,将调用此方法而不是dealloc。

启用ARC后,您无需执行任何操作,因为无论如何都不会运行垃圾收集器,无论如何都不会调用finalize。 ARC会自动为release waffleArray生成dealloc waffleArray代码,这足以在这种情况下进行正确的内存管理,因为{{1}}的保留计数将会降至0,被释放,它将释放数组中的对象。