快速提问:我使用了很多NSObject派生类,并且想知道如何正确清理可能拥有其他类实例的类属性(在下面的代码段中,这是一个自定义类实例的数组)。我对new
和finalize
的使用是否正确?
我的理解是new
是一种方便的方法,它调用alloc和init,finalize
在dealloc
之前调用 - 至少这是我从阅读文档中收集的内容。我有这个权利吗?
感谢您提供任何建议/最佳做法等等!
- (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];
}
答案 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,被释放,它将释放数组中的对象。