文字语法的内存管理

时间:2015-08-15 07:55:54

标签: ios objective-c arrays memory-management

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

      
        
    • NSArray *array = @[@0, @1];

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

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

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

3 个答案:

答案 0 :(得分:3)

第一和第二模式的结果是相同的。 第一种模式是第二种

的便利语法

来源:Objective-C Literals

答案 1 :(得分:2)

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

不要试图推断自动释放池中可能存在或不存在哪些对象。另外,不要试图推断保留计数。只关注自己的所有权和责任。

答案 2 :(得分:1)

除了内存分配的细节之外,

之间存在一个很大的区别
NSArray* array = @[obj1, obj2, obj3];

NSArray* array = [NSArray arrayWithObjects: obj1, obj2, obj3, nil];

第二个将停在第一个零参数。你期望一个包含三个元素的数组,但是如果obj1!= nil和obj2 == nil,那么结果就是一个包含一个元素的数组。如果obj1,obj2或obj3中的任何一个为零,则第一个抛出异常。