内存管理iOS/ARC



我正在读一本书(链接),上面写着:"所有这些自动清理和内存回收都只需将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,则可以与拥有的实例一样长)之间的区别。

最新更新