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)
}
一般来说,如果你想要一个自动释放的对象,你必须坚持下去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,它有一个解决方案).
| 归档时间: |
|
| 查看次数: |
1236 次 |
| 最近记录: |