Objective c 目标c:为ABRecordRef对象编写自定义getter

Objective c 目标c:为ABRecordRef对象编写自定义getter,objective-c,core-data,nsmanagedobject,Objective C,Core Data,Nsmanagedobject,我正在尝试为ABRecordRef类型的属性(这是一个C类型)编写一个自定义getter。我不理解它的内存语义,每次访问该属性时,我都会遇到崩溃。以下是我正在做的: @interface Person : NSManagedObject{ ... } @property (nonatomic) ABRecordRef abRecordPerson; @implementation Person @synthesize abRecordPerson; - (ABRecordRef) abRec

我正在尝试为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访问它时,我会遇到崩溃(EXC_BAD_access)

你知道我做错了什么吗?我猜我在记忆中做错了什么。但是,如果我将abRecordPerson声明为动态属性并将其添加到Person实体的核心数据模型中,那么这段代码就起作用了。由于我无法以任何方式真正持久化对象,我决定将其从模型中取出,将动态更改为合成,从那时起我无法使其工作


谢谢

在您的
@属性
声明中,我认为您需要使用
分配
复制
。可能它默认为
retain
,这会导致基元类型崩溃。

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

通常,如果对未建模的属性调用
primitiveValueForKey:
,则会得到随机建模属性的值。我不确定这是否仍然有效,但这可能是本例中问题的根源,因为没有“原始”值可访问,只有值

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

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

查看获取规则部分:谢谢,但我在返回之前尝试了CFRetain(记录);我也试过自己。abRecordPerson=c设置时读取(记录);两者似乎都不起作用。我做错了什么?