NSManagedObject - NSSet 被删除?

Posted

技术标签:

【中文标题】NSManagedObject - NSSet 被删除?【英文标题】:NSManagedObject - NSSet gets removed? 【发布时间】:2011-02-23 23:22:23 【问题描述】:

我有一个 nsmanagedObject 这个 NSManagedObject 包含一个 NSSet。

当我在保留计数为 2 的 NSManagedObject 上调用 release 时,NSSet 的数据会丢失。

保留一个 NSManagedObject 不会同时保留它的所有属性吗??

- (id)initViewWithManagedObject :(NSManagedObject)obj

     if (self = [super init])
     
          self.managedObject = obj;
     
     return self;


- (void)dealloc

     self.managedObject = nil;
     //Here is when the nsset data gets removed

     [super dealloc];

下面描述了该属性是如何创建的

@interface MyManagedObject :NSManagedObject
@property (nonatomic, retain) NSSet *mySet;
@end

@implementation MyManagedObject
@dynamic mySet;
@end

【问题讨论】:

【参考方案1】:

你为什么打电话给[self.managedObject release]?您应该永远在调用 getter 的结果上调用 -release。这里适当的代码就是 [managedObject release](假设 managedObject 是支持 ivar 的名称)。

此外,一旦你释放了对象,你为什么要检查它的属性?

【讨论】:

谢谢,但这并不能解决问题 您最初的问题是基于在释放对象后检查对象属性的内容。您能否重申您的问题,以免发生这种情况? 这是一个核心数据对象 (NSManagedObject),当我说 NSSet 数据丢失时,我的意思是永久丢失,所以下次我获取并检索同一个对象时,NSSet 是空的。摆脱损失的方法是不释放导致泄漏的dealloc方法中的NSManagedObject。 您是否在任何发布操作发生之前保存您的上下文? 不,每次应用挂起时我都会保存上下文【参考方案2】:

假设您的应用程序正在获取您希望成为核心数据关系的 NSSet 是否安全?

在这种情况下,问题不在于释放和保留。问题是您在完成对象之前没有保存托管对象上下文,因此当您再次获取时,数据会丢失。

【讨论】:

【参考方案3】:

以下是问题的解决方案: 我必须创建从对象 a 到 b 以及从对象 b 到 a 的双向关系。 例如:

CountryManagedObject *country = [Factory getCountryByName:@"USA"];
StateManagedObject *state = [Factory createStateByName:@"California"];
[country.statesSet addObject:state]; //assuming NSSet responds to addObject
//the line below fixed the problem
//State has a reversed relationship to country named "country"
state.country = country;

【讨论】:

假设 Core Data 和您的 setter 设置正确,您永远不必手动定义互惠关系 - Core Data 会自动为您完成。

以上是关于NSManagedObject - NSSet 被删除?的主要内容,如果未能解决你的问题,请参考以下文章

如何在核心数据 NSManagedObject 关系的 NSSet 中添加或删除项目时触发通知?

NSManagedObject 中未保存的 NSSet 成员是不是会在保存时保留已删除的成员?

如何强制重新获取 NSManagedObject 的关系集

比较 Fetchrequest Xcode Swift OSX 核心数据的谓词中的 NSSet

获取实体 NSSet 的最后一条记录?

MagicalRecords 使用 NSSet 添加记录