Ios 文本语法的内存管理

Ios 文本语法的内存管理,ios,objective-c,arrays,memory-management,Ios,Objective C,Arrays,Memory Management,创建数组变量有三种模式: NSArray*数组=@[@0,@1] NSArray*array=[NSArray arrayWithObjects:@0、@1、nil] NSArray*array=[[NSArray alloc]initWithObjects:@0、@1、nil] 当我使用第二种模式创建时,varialbe“array”将被抛出到autoreleasepool; 当我使用第三个时,var的retainCount将是1,但不会被抛出到autoreleasepool; 我想知道

创建数组变量有三种模式:

  • NSArray*数组=@[@0,@1]

  • NSArray*array=[NSArray arrayWithObjects:@0、@1、nil]

  • NSArray*array=[[NSArray alloc]initWithObjects:@0、@1、nil]

  • 当我使用第二种模式创建时,varialbe“array”将被抛出到autoreleasepool; 当我使用第三个时,var的retainCount将是1,但不会被抛出到autoreleasepool; 我想知道第一种模式与第二种模式或第三种模式具有相同的效果


  • 第一和第二模式的结果相同。 第一种模式是第二种模式的一种方便语法


    来源:

    一般规则是,如果您没有调用以“alloc”或“new”开头或包含“copy”的方法,那么您就不拥有该对象,也没有权利也没有责任释放它。当然,如果你明确地保留了一个对象,那么你必须用释放(或者自动释放,这只是安排释放它的另一种方式)来平衡它


    不要试图对自动释放池中可能存在或不存在的对象进行推理。此外,不要试图对保留计数进行推理。关注自己的所有权和责任。

    总是把保留数看作是增量。因此:

    1. NSArray *array = @[@0, @1];
    
    array
    的retain count为+0(它在创建时已保留并随后自动删除在很大程度上是无关的,事实上,它可能根本没有被保留并自动删除--
    NSString*foo=@“foo”;
    具有完全相同的+0语义,但实现细节不是retain/autorelease)

    与(1)相同,只是需要更多的手指锻炼

    NSArray *array = [[NSArray alloc] initWithObjects:@0, @1, nil];
    

    就您而言,
    数组
    有一个+1保留计数。您需要知道的唯一细节是,要放弃代码对
    array
    的责任,该对象必须是
    release
    d或
    autorelease
    d。它是否是使用+1保留计数创建的。。。是否有42的内部保留计数。。。是否保留5次并自动删除4次。。。。所有这些都与您的代码完全无关。

    除了内存分配的细节之外,它们之间有一个很大的区别

    NSArray* array = @[obj1, obj2, obj3];
    


    第二个将在第一个零参数处停止。您需要一个包含三个元素的数组,但如果obj1!=nil和obj2==nil则结果是一个包含一个元素的数组。如果obj1、obj2或obj3中的任何一个为nil,则第一个将引发异常

    不完全正确:文本扩展为
    +[NSArray arraywhithobjects:count:://code>。但是关于自动释放,结果是一样的,正如你所说的。同样重要的是要注意,使用ARC,许多自动释放的例子都被优化了,所以关于自动释放池的推理更加困难和徒劳。虽然这个答案有很好的信息,但实际上并没有回答这个问题。“1是像2还是3?@rmaddy,我认为它回答得很好#1不涉及调用以“alloc”或“new”开头或包含“copy”的方法#2也不涉及这一点#3岁。所以,我不能指望读者从中得出结论(www.whentouseretaincount.com.:)
    
    NSArray* array = @[obj1, obj2, obj3];
    
    NSArray* array = [NSArray arrayWithObjects: obj1, obj2, obj3, nil];