0

我有一个名为的实体,它具有一组实体(一对多关系)LogBook的属性(称为)。columnsLogBookColumn

我看到检索可变列集的标准方法似乎是:

NSEntityDescription *myLogbook;
myLogbook = [NSEntityDescription insertNewObjectForEntityForName:@"LogBook"
                                          inManagedObjectContext:self.managedObjectContext];
NSMutableSet *columns = [myLogbook mutableSetValueForKey:@"columns"];

而不是第三行的方法,我想使用点表示法。为此,我创建了类定义,也称为LogBookand LogBookColumn,并使用 @property 创建 setter 和 getter。

LogBook *myLogBook;
myLogbook = [NSEntityDescription insertNewObjectForEntityForName:@"LogBook"
                                          inManagedObjectContext:self.managedObjectContext];
NSMutableSet *columns = (NSMutableSet *)myLogbook.columns;

那么,columns默认情况下真的是一个可变集吗?我做了两件事来验证:

  • 尝试写入列表,例如:[columns addObject:aColumn];
  • 询问:BOOL isKindOfMutableSet = [myLogbook.columns isKindOfClass:[NSMutableSet class]];

两者都可以达到预期的结果,这可能会使这个问题过大,但我非常担心难以追踪的内存错误。我还想知道问这个问题是否isKindOfClass会起作用,因为我已将其定义为可变集 - 所以即使底层内存组织不支持可变集,它也不会起作用吗?

以上所有内容总结为:这是访问和更改columns属性/属性的正确方法吗?

4

1 回答 1

1

根据此文档,应将多对关系声明为NSSet,这是有道理的。即使属性返回NSMutableSet,也不能保证更新NSMutableSet会正确更新关系(确实如此mutableSetValueForKey:

如果您真的想要一个可变访问器,那么只需创建一个readonly包装的属性mutableSetValueForKey:

更新:

否则,我们应该使用 - (void)addLogBookColumnsObject:(LogBookColumn *)value;, - (void)removeLogBookColumnsObject:(LogBookColumn *)value;, - (void)addLogBookColumns:(NSSet *)values;, - (void) removeLogBookColumns:(NSSet *)值;由 Core Data 为我们生成。

于 2013-01-23T03:15:24.140 回答