繁体   English   中英

Objective-C:为ABRecordRef对象编写一个自定义的吸气剂

[英]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声明中,我认为您需要使用assigncopy 也许默认情况下retain它会导致原始类型崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM