【问题标题】:NSManagedObject init/dealloc equivalentNSManagedObject init/dealloc 等价物
【发布时间】:2010-11-04 07:12:40
【问题描述】:

我在 NSManagedObject 子类 bar 中有一个对象 ivar foo,只要该对象存在,我就需要一直在那里。

为了确保正确创建 foo,我将 awakeFromInsert 子类化为在创建 bar 时创建 foo。我在 awakeFromFetch 中做了同样的事情,以确保在从商店获取 bar 时,foo 在那里。

为了解决这个问题,我在 willTurnIntoFault 和 prepareForDeletion 中释放 foo

然而,事实证明,当我删除bar 时,prepareForDeletion 和 willTurnIntoFault 都会被调用,释放 foo 两次。

我意识到我可能不能在 prepareForDeletion 中释放它,但我想知道这里的最佳实践是什么,所以我明白什么时候会变成错误等。对于普通对象,我d 只需在 init 中创建 foo 并在 dealloc 中销毁它。

谢谢!

【问题讨论】:

    标签: iphone core-data nsmanagedobject


    【解决方案1】:

    不只是释放 ivar,而是释放它并将其设置为 nil。释放nil 没有任何效果,所以如果它发生两次就可以了。

    更好的是,将foo 设为具有retain 语义的属性,并始终通过-setFoo: 设置它。

    【讨论】:

    • 我了解第一部分,但是将其设为具有保留的属性与它有什么关系?或者你的意思是 self.foo = nil,因为它会自动释放 ivar?
    • 是的,如果 foo 被声明为“@property (readwrite, retain)”并在你的类的@implementation 中合成,那么 [self setFoo:nil] 和 self.foo = nil 都会释放它。 (此外,将其设置为新值将释放旧值。)这是一个好习惯,因为您 a) 不太可能忘记释放 ivars,并且 b) 如果您向之后发布了 ivar(因为它将为零)。
    • 好的,好的。所以在 init 中(一般情况下,不是这种情况),我只是为 foo 创建一个本地对象,执行 self.foo = 不管,然后 [whatever release],对吗?
    • 是的,只要您以您拥有它的方式创建对象(alloc/init、复制等)。如果您不知道我在说什么,请阅读bit.ly/dsVvdZ
    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多