Objective c 内存管理iOS/ARC

Objective c 内存管理iOS/ARC,objective-c,Objective C,我正在读一本书(),书中写道:“所有这些自动清理和内存回收都是通过将项设置为零来实现的。这就是ARC的威力。”。 这是关于以下代码的描述: // create array NSMutableArray *items = [[NSMutableArray alloc] init]; // add random BNRItems to the array for (int i = 0; i < 10; i++) { BNRItem

我正在读一本书(),书中写道:“所有这些自动清理和内存回收都是通过将
项设置为零来实现的。这就是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;
//创建数组
NSMutableArray*项=[[NSMutableArray alloc]init];
//将随机BNRItems添加到数组中
对于(int i=0;i<10;i++){
bNitem*p=[bNitem随机项];
[项目添加对象:p];
}
//在数组中打印项目
用于(b标准*项目中的项目){
NSLog(@“%@”,项目);
}
项目=无;
它基本上简要说明了如何通过设置
items=nil
正确销毁上面的所有对象。 我的问题是:

  • 假设我正在使用ARC,并且我没有设置
    items=nil
    -这意味着什么 我会有内存泄漏吗

我通过覆盖BNRItem的dealloc并打印一些信息进行了测试,dealloc似乎在所有BNRItem上都被正确调用,即使我没有设置
items=nil

否,它也不会泄漏。ARC将在其超出范围时执行释放消息。时间/顺序不是为了优化目的而指定的。从技术上讲,它可以使用自动释放代替。

不,它不会泄漏。ARC将在其超出范围时执行释放消息。时间/顺序不是为了优化目的而指定的。从技术上讲,它可以自由地使用自动释放功能。

将引用设置为
nil
会告诉ARC您已经完成了它,并允许它立即清理。不将其设置为
nil
并不意味着它不会被清除,只是可能不会这么快被清除


您还需要注意测试中的局部变量(因为它们总是在定义范围的末尾被清除)和实例变量(如果不是nilled,它们可以与拥有的实例一样长)之间的差异。不将其设置为
nil
并不意味着它不会被清除,只是可能不会这么快被清除


您还需要注意测试中的局部变量(因为它们总是在定义范围的末尾被清除)和实例变量(如果不是nilled,它们可以与拥有的实例一样长)之间的差异.

您的方法在某些情况下似乎有效,但我们需要ARC自动清理对象,否则可能会有许多mem泄漏问题。这不是OP要求的。您的方法在某些情况下似乎有效,但我们需要ARC自动清理对象,否则可能会有许多mem泄漏问题。OP不是这样要求的问一下。是的,我明白了,我想我被书中的这句话弄糊涂了:“所有这些自动清理和内存回收都是通过将项目设置为零来实现的。这就是ARC的力量。”-这句话说将项目设置为零可以清理所有的东西,但这并不意味着如果不将项目设置为零,就不会进行清理。是的,我明白了,我想我被书中的这句话弄糊涂了:“所有这些自动清理和内存回收都是通过将项目设置为零来实现的。这就是ARC的力量。”-这句话说将项目设置为零可以清理所有东西,但这并不意味着如果不将项目设置为零,就不会进行清理。是的,我明白了,我想我被书中的这句话弄糊涂了:“所有这些自动清理和内存回收都是通过将项目设置为零来实现的。这就是ARC的力量。”-这句话说,将项目设置为零将清理所有东西,但这并不意味着如果不设置items=nil,清理就不会发生。@user2568508很容易被误解——ARC也会在-dealloc中释放你的IVAR。是的,我知道我想我被书中的这句话弄糊涂了:“所有这些自动清理和内存回收都是通过将items设置为nil来实现的。这就是ARC的威力。”-这句话说,将items设置为nil将清除所有内容,但这并不意味着如果不将items=nil设置为nil,则不会进行清理。@user2568508很容易被误解——ARC还将在-dealloc中释放您的ivars。