使用地址簿委托方法时在xcode上强制转换错误



我从apple dev库逐行复制了这个方法,并获得了两个NSString类型转换的类型转换错误。如何解决这些问题?(我使用ARC)

- (BOOL)peoplePickerNavigationController:
        (ABPeoplePickerNavigationController *)peoplePicker
  shouldContinueAfterSelectingPerson:(ABRecordRef)person {
NSString* name = (NSString *)ABRecordCopyValue(person,
                                         kABPersonFirstNameProperty);
self.firstName.text = name;
name = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
self.lastName.text = name;
[self dismissModalViewControllerAnimated:YES];
return NO;
}

谢谢你的帮助!

听起来你在用ARC。

ARC禁止在指向Objective-C对象的指针和其他类型的指针(包括指向CoreFoundation对象的指针)之间进行标准强制类型转换。

下面的代码,在手动内存管理下是正确的,不能用ARC编译:

NSString* name = (NSString *)ABRecordCopyValue(person,
                             kABPersonFirstNameProperty);

要用ARC编译,需要对强制转换进行注释。参见桥式类型转换。

NSString* name = (__bridge_transfer NSString *)ABRecordCopyValue(person,
                                               kABPersonFirstNameProperty);

__bridge_transfer注释将值移动到ARC中,转移所有权,也就是说,它告诉ARC这个对象已经保留了,并且ARC不需要再次保留它。

尝试这种类型的转换,而不是:

CFStringRef name = (CFStringRef)ABRecordCopyValue(person, kABPersonFirstNameProperty);
self.lastName.text = (__bridge NSString *) name;

CFStringRefNSString *是"免费桥接"(为您链接的文档),但编译器正在寻找从ABRecordCopyValue调用返回的核心基础类型。这里的行使用Core Foundation类型。然后,当您将其分配给标签时,您可以将name强制转换为NSString *类型。

以下是ARC参与的免费桥接的更多信息

相关内容

最新更新