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 成员是不是会在保存时保留已删除的成员?