0

我正在阅读一些书(链接),上面写着:“所有这些自动清理和内存回收只需设置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 并打印一些信息进行了测试,即使我没有设置,也似乎在所有 BNRitems 上都正确调用了 dealloc items = nil

4

2 回答 2

2

不,它不会泄漏。ARC 将在超出范围时执行发布消息。时序/顺序并非特定于优化目的。从技术上讲,它可以自由地使用自动释放。

于 2013-07-16T09:30:39.993 回答
1

将引用设置为nil告诉 ARC 您已完成它并允许它立即清理。不设置它nil并不意味着它不会被清理,它可能不会被清理得那么快。

您还需要注意测试中的局部变量(因为它们总是在定义范围的末尾被清理)和实例变量(如果没有被取消,它们可以与拥有的实例一样长)之间的区别。

于 2013-07-16T09:31:52.030 回答