代码之家  ›  专栏  ›  技术社区  ›  pdiddy

IPhone NSMutableArray内存管理

  •  1
  • pdiddy  · 技术社区  · 14 年前

    在Iphone开发中是个无足轻重的人,只是想理解。

    在下面的代码中,exaclty发生了什么?

    City *newCity = [[City alloc] init];
    newCity.name = @"name";
    
    NSMutableArray *array = [[NSMutableArray alloc] init];
    [array addObject:newCity];
    
    City *getCity = [array objectAtIndex:0];
    
    [city release];
    [array release];
    

    向数组中添加对象时,数组是执行retain操作还是创建一个全新的实例?

    当我做一个目标索引来检索城市时。我应该释放它吗?我想不会吧,因为我不拥有它?我应该这样想吗?

    另外,当我对数组执行release时,它是否遍历数组中的所有对象并对这些对象调用release?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Joshua Weinberg    14 年前

    你所有的假设都是正确的。

    如果你从所有权的角度来考虑,你永远是对的(除了一些记录良好的例外情况)。

    City *newCity = [[City alloc] init]; //newCity is +1
    newCity.name = @"name"; //name +1
    
    NSMutableArray *array = [[NSMutableArray alloc] init]; //array +1
    [array addObject:newCity]; //new city +1
    
    City *getCity = [array objectAtIndex:0]; //no memory change
    
    [city release]; //assuming this was supposed to be newCity, newCity -1,
    [array release]; //array -1, array deallocs, calling release on all its objects, newCity -1, deallocs
    
        2
  •  1
  •   Firoze Lafeer    14 年前

    如果您使用-[NSArray objectAtIndex:idx],则retain计数不会增加,您不会“拥有”您获得的对象,也不需要释放它。除非,很明显,你在从数组中得到它之后选择保留它。

    是的,当数组被释放时,它将释放数组中的每个对象。(这不等于说当你释放阵列时它会释放它们。只有当数组被释放时才会发生这种情况)