【问题标题】:retaining an object that was added to a relationship property of an NSManagedObject保留添加到 NSManagedObject 的关系属性的对象
【发布时间】:2012-06-05 15:07:03
【问题描述】:

有一个 NSManagedObject 子类:

    @interface ManagedActivityAmount : NSManagedObject

    @property (nonatomic, retain) NSNumber * distance;
    @property (nonatomic, retain) NSNumber * duration;
    @property (nonatomic, retain) NSSet *sets;

    @end

    @interface ManagedActivityAmount (CoreDataGeneratedAccessors)

    - (void)addSetsObject:(ManagedPowerSet *)value;
    - (void)removeSetsObject:(ManagedPowerSet *)value;
    - (void)addSets:(NSSet *)values;
    - (void)removeSets:(NSSet *)values;

    @end

我在保持对我添加到集合关系的对象的引用时遇到问题:

    - (void)addSetsObject:(ManagedPowerSet *)value;

ManagedPowerSet 对象已成功添加到 ManagedActivityAmount 集属性中,因此我假设它的保留计数为 1(实际对象在此之前自动释放,因此在将其添加到集合之前保留计数为 0)。我对么?我错过了什么吗?

我将 ManagedPowerObject 分配给视图控制器的另一个实例变量(这是一个私有实例变量,而不是保留属性),但我以后似乎无法访问它。我应该保留它吗?我正要这样做并检查,但我真的很想了解我们一开始就没有保留它。

谢谢:)

【问题讨论】:

    标签: objective-c ios core-data memory-management nsmanagedobject


    【解决方案1】:

    如果您不使用 ARC,则必须声明对以后打算使用的任何内容的所有权(保留)。完成后释放它(对于 ivars,这通常在类的 dealloc 实现中)。我建议您使用属性来执行此操作,因为它通常会减少编码。这是因为您必须始终在分配新指针之前释放旧指针:

    [_managedPowerObject release];
    _managedPowerObject = [managedPO retain];
    

    这将在直接分配给 ivar(实例变量)时使用。或者你可以只使用一个属性:

    @property (nonatomic, retain) ManagedPowerObject *managedPowerObject;
    

    该属性的默认实现将为您处理释放/保留,现在您可以简单地使用:

    self.managedPowerObject = managedPO;
    

    我建议阅读 Apple 的内存管理指南: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html#//apple_ref/doc/uid/10000011-SW1

    【讨论】:

    • thx #sc0rp10n 的答案,但它并没有真正帮助我。我尝试在没有帮助的情况下保留,实际分配中有问题。我正在查看调试器,我可以看到两个指针的内存地址仍然不同,我错过了其他东西..
    【解决方案2】:

    所以我没有遗漏任何东西,保留计数假设是正确的,不需要保留,因为对象比控制器寿命长,如果它是一个应该分配的属性..

    这个问题对我来说真的很愚蠢,我没有分配其他东西让对象看起来像丢失了,但实际上并没有。

    至于调试器,这两个指针似乎应该指向同一个地址,但没有——我不知道为什么会发生这种情况,我猜 xcode 调试器有一些延迟..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-08
      • 2013-10-03
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 2021-09-19
      • 2021-06-09
      • 1970-01-01
      相关资源
      最近更新 更多