我正在尝试为类型为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模型中,则此代码有效。因为无论如何我都无法真正坚持这个对象,所以我决定把它从模型中取出来,改变动态来合成,从那以后我无法让它工作。
感谢。
答案 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
声明中,我认为您需要使用assign
或copy
。也许它默认为retain
会导致原始类型崩溃。