objective-c:为ABRecordRef对象编写自定义getter

时间:2011-09-09 23:48:26

标签: objective-c core-data nsmanagedobject

我正在尝试为类型为ABRecordRef(属于C类型)的属性编写自定义getter。我不明白这个的内存语义,并且每当访问该属性时我都会遇到崩溃。这就是我正在做的事情:

@interface Person : NSManagedObject{
...
}
@property (nonatomic) ABRecordRef abRecordPerson;

@implementation Person
@synthesize abRecordPerson;

- (ABRecordRef) abRecordPerson
{
    NSLog(@"start abRecordPerson");
    ABRecordRef record = NULL;

    [self willAccessValueForKey:@"abRecordPerson"];
    record = [self primitiveValueForKey:@"abRecordPerson"];
    [self didAccessValueForKey:@"abRecordPerson"];
    if (record == NULL) {
      // load record by ID
      ABAddressBookRef abook = [Person getAddressBook];
      record = ABAddressBookGetPersonWithRecordID(abook, [self.abGlobalID intValue]);
     }
     return record;
}

但是当我尝试使用self.abRecordPerson在同一个Person类中的任何地方访问它时,我遇到了崩溃(EXC_BAD_ACCESS)。

任何想法我可能做错了什么?我猜我在记忆中做错了什么。但是,如果我将abRecordPerson声明为动态属性并将其添加到Person实体的Core Data模型中,则此代码有效。因为无论如何我都无法真正坚持这个对象,所以我决定把它从模型中取出来,改变动态来合成,从那以后我无法让它工作。

感谢。

2 个答案:

答案 0 :(得分:1)

如果这是一个未建模的属性,则不需要键值观察调用,例如willAccessValueForKey:primitiveValueForKey:didAccessValueForKey:

用于,如果您在未建模的属性上调用primitiveValueForKey:,则会获得随机建模属性的值。我不确定这是否仍然存在,但在这种情况下它可能是问题的根源,因为没有“原始”值可以访问而只是值。

对于未建模的属性,只需使用传统的访问器,如:

if (abRecordPerson == nil) {
  // load record by ID
  ABAddressBookRef abook = [Person getAddressBook];
  self.abRecordPerson = ABAddressBookGetPersonWithRecordID(abook, [self.abGlobalID intValue]);
 }
 return abRecordPerson;

答案 1 :(得分:0)

@property声明中,我认为您需要使用assigncopy。也许它默认为retain会导致原始类型崩溃。