[英]objective-c: writing a custom getter for ABRecordRef object
我正在尝试为ABRecordRef类型(这是C类型)的属性编写自定义的吸气剂。 我不了解这种情况的内存语义,并且每次访问该属性时,都会不断崩溃。 这是我在做什么:
@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模型中,则此代码有效。 由于我仍然无法真正持久化对象,因此我决定将其从模型中删除,将其动态更改为合成对象,并且此后也无法使用它。
谢谢。
如果这是一个未建模的性能,你不需要键-值观察调用,例如willAccessValueForKey:
primitiveValueForKey:
和didAccessValueForKey:
习惯了,如果你叫primitiveValueForKey:
对未建模属性,你会得到一个随机建模属性的值来代替。 我不确定这是否仍然有效,但是在这种情况下,这很可能是问题的根源,因为没有“原始”值可访问,而只有该值。
对于未建模的属性,只需使用常规访问器,例如:
if (abRecordPerson == nil) {
// load record by ID
ABAddressBookRef abook = [Person getAddressBook];
self.abRecordPerson = ABAddressBookGetPersonWithRecordID(abook, [self.abGlobalID intValue]);
}
return abRecordPerson;
在您的@property
声明中,我认为您需要使用assign
或copy
。 也许默认情况下retain
它会导致原始类型崩溃。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.