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

需要保留两次NSArray以避免崩溃-为什么?

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

    我有一个运行可靠的复杂应用程序,但我很困惑为什么我需要保留一个特定的NSArray(“sources”) 以防止崩溃(虽然控制台上没有报告异常,但应用程序崩溃并返回到跳板)。

    如果我只保留一次数组(或者根本不保留),就会发生崩溃。有两个保留,应用程序是完全稳定的。

    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Sources" ofType:@"plist"];
    
    sources  = [[NSArray arrayWithContentsOfFile:plistPath] autorelease];
    
    [sources retain];
    [sources retain];
    

    关于我为什么需要保留这个数组的思考 两次 很感激。提前谢谢。

    6 回复  |  直到 14 年前
        1
  •  7
  •   Chuck    14 年前

    在那里 autorelease 就像 release 只是以后才会发生。不仅如此,首先自动释放数组是错误的,因为您不拥有它。一个 retain 必须声明数组的所有权。第二种方法通过平衡错误使用 自动释放酶 .

        2
  •  10
  •   Jeff Kelley    14 年前

    +arrayWithContentsOfFile: ,它返回一个自动删除的对象,然后再次自动删除它。打电话给 -autorelease

    sources  = [[NSArray arrayWithContentsOfFile:plistPath] retain];
    
        3
  •  3
  •   Cris    14 年前

    这和自动释放有关吗?我不明白为什么会这样:应该是工厂方法自动释放。虽然我不知道添加一个额外的自动释放的结果是什么,但如果你把它和一个保留一起删除,可能值得一看会发生什么。

        4
  •  3
  •   drekka    14 年前

        5
  •  2
  •   koo    14 年前

    这是因为arrayWithContentsOfFile:将自动删除的数组返回给您。对此数组调用autorelease将在当前事件运行循环结束时释放它两次。

        6
  •  1
  •   EdChum Yuriy    12 年前
    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Sources" ofType:@"plist"];
    
    sources  = [[NSArray alloc] initWithContentsOfFile:plistPath];