【问题标题】:NSManagedObject - NSSet gets removed?NSManagedObject - NSSet 被删除?
【发布时间】: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

【问题讨论】:

    标签: iphone objective-c core-data nsmanagedobject


    【解决方案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 会自动为您完成。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多