我正在读一本书(链接),上面写着:"所有这些自动清理和内存回收都只需将items
设置为零即可实现。这就是ARC的力量。这是关于以下代码的:
// create array
NSMutableArray *items = [[NSMutableArray alloc] init];
// add random BNRItems to the array
for (int i = 0; i < 10; i++) {
BNRItem *p = [BNRItem randomItem];
[items addObject:p];
}
// print items in array
for (BNRItem *item in items) {
NSLog(@"%@", item);
}
items = nil;
它基本上简要地解释了如何通过设置items = nil
来正确地销毁上面的所有对象。我的问题是:
- 假设我正在使用ARC,并且我没有设置
items = nil
-这意味着吗我会有内存泄漏吗
我通过覆盖BNRItem的dealloc并打印一些信息进行了测试,dealloc似乎在所有BNRItem上都被正确调用,即使我没有设置items = nil
。
不,它不会泄漏。当发布消息超出范围时,ARC将执行该消息。出于优化目的,时间/顺序不是特定的。从技术上讲,它可以自由使用自动释放酶。
设置对nil
的引用,会告诉ARC您已经完成了它,并允许它立即清理。不将其设置为nil
并不意味着它不会被清除,只是可能不会这么快被清除。
您还需要注意测试中的局部变量(因为它们总是在定义范围的末尾被清除)和实例变量(如果不是niled,则可以与拥有的实例一样长)之间的区别。