保留添加到NSManagedObject的relationship属性的对象

时间:2012-06-05 15:07:04

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

拥有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 sets属性中,并且我假设它的保留计数为1(因此实际对象在此之前自动释放,因此在将其添加到集合之前保留计数为0)。我对么?我错过了什么吗?

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

谢谢:)

2 个答案:

答案 0 :(得分:0)

如果您不使用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

答案 1 :(得分:0)

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

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

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