我是否应该在分配到保留属性时保留自动释放的对象?

Jam*_*mie 1 iphone properties objective-c autorelease retain

在我保留的一个属性的getter中,我为我的模型对象("models")分配并分配了一个NSArray.然后我使用"sortedArrayUsingSelector:"方法对NSArray进行排序.根据文档,这将返回一个自动释放的NSArray.然后我将其重新分配给我的"模型"数组.

起初,我从未保留过这个自动释放的排序数组,并发现当我将这个viewController从堆栈中弹出时,我的应用程序会崩溃,说我试图减少释放对象或某种类型的引用计数.然后我在下面的代码中添加了一个retain,一切都没问题.

我的问题是,这是正确的,我应该保留自动释放的对象,即使我在其声明中保留此属性并在我的dealloc中释放它?

- (NSArray *)models {

    if (!models) {
        models = [[NSArray alloc] initWithArray:[self.modelDictionary allKeys]];
        models = [[models sortedArrayUsingSelector:@selector(compare:)] retain];
    }
    return models;
Run Code Online (Sandbox Code Playgroud)

}

bbu*_*bum 7

一般来说,如果你想要一个自动释放的对象,你必须坚持下去retain.

这段代码有几个问题:

- (NSArray *)models {

    if (!models) {
        models = [[NSArray alloc] initWithArray:[self.modelDictionary allKeys]];
        models = [[models sortedArrayUsingSelector:@selector(compare:)] retain];
    }
    return models;
}
Run Code Online (Sandbox Code Playgroud)
  • alloc/init用第二models=行代码泄漏了d 的数组

  • 你说"在声明中保留这个属性,但是在上面的代码中你直接分配给实例变量,绕过了可能由 @synthesize

  • 它是一个改变被获取变量状态的getter方法......虽然这种惰性初始化很有吸引力,但必须非常小心.核心数据经历了相当长的内部复杂性,以这种方式允许懒惰的国家群体.上面的代码也意味着models当执行getter时,属性的Key-Value Observers 不会看到更改.然而,如果你willChangeValueForKey:/didChangeValueForKey:从getter手动调用,你最终会从内部发送一个更改通知getter,很可能导致某些东西消耗掉这个值,然后调用getter的人首先检索该值.声音混乱?它是 - 可能会或可能不会导致问题.根据我的经验,有一天可能会引发问题.


一些建议:

  • 如果可以的话,使用核心数据.为了使Core Data非常高效并与系统完美集成,我们投入了大量的工程工作.

  • 将getter/setter与其余逻辑分开.更有可能的是,您的应用程序中有一个逻辑点,您需要"获取"模型.当你这样做时,通过其他方法告诉对象故障,然后获取模型.这可能看起来很痛苦,但是对象图的构造非常专业,而不是查询该图以获取信息(或者使用Core Data,它有一个解决方案).