将“NSString * _strong *发送到_unsafe_unretained id *类型的参数”更改指针的保留/释放属性

时间:2012-10-12 23:53:37

标签: objective-c ios xcode automatic-ref-counting

我收到以下错误

Sending "NSString *_strong*to parameter of type _unsafe_unretained id* "changes retain/release properties of pointer ...

在以下行中:[theDict getObjects:values andKeys:keys]; 我试图从联系人添加地址到我的应用程序。有人可以向我解释一下它的抱怨吗?我认为这是一个ARC问题,可能与手动内存管理有关?但我不确定如何解决它。

   - (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)peoplePicker
  shouldContinueAfterSelectingPerson:(ABRecordRef)person
                            property:(ABPropertyID)property
                          identifier:(ABMultiValueIdentifier)identifier


 {
    if (property == kABPersonAddressProperty) {
    ABMultiValueRef multi = ABRecordCopyValue(person, property);

    NSArray *theArray = (__bridge id)ABMultiValueCopyArrayOfAllValues(multi);

    const NSUInteger theIndex = ABMultiValueGetIndexForIdentifier(multi, identifier);

    NSDictionary *theDict = [theArray objectAtIndex:theIndex];

    const NSUInteger theCount = [theDict count];

    NSString *keys[theCount];

    NSString *values[theCount];

    [theDict getObjects:values andKeys:keys]; <<<<<<<<< error here

    NSString *address;
    address = [NSString stringWithFormat:@"%@, %@, %@",
               [theDict objectForKey: (NSString *)kABPersonAddressStreetKey],
               [theDict objectForKey: (NSString *)kABPersonAddressZIPKey],
               [theDict objectForKey: (NSString *)kABPersonAddressCountryKey]];

    _town.text = address;

    [ self dismissModalViewControllerAnimated:YES ];

        return YES;
}
return YES;
 }

2 个答案:

答案 0 :(得分:1)

NSDictionary的文档getObjects:andKeys:将其显示为:

- (void)getObjects:(id __unsafe_unretained [])objects andKeys:(id __unsafe_unretained [])keys

但是你传入的两个值是强NSString引用(默认情况下局部变量和ivars很强。这就是ARC错误的原因。你的参数与预期的类型不匹配。

变化:

NSString *keys[theCount];
NSString *values[theCount];

为:

NSString * __unsafe_unretained keys[theCount];
NSString * __unsafe_unretained values[theCount];

应修复编译器问题。

此更改意味着阵列中的所有对象都不会安全保留。但只要'theDict'没有在'keys'和'values'之前超出范围,那么你就可以了。

答案 1 :(得分:-1)

你是正确的,这是一个ARC错误,它很困惑,你正试图将NSArrays分配给NSStrings并且你已经尝试创建一个NSStrings数组,我不确定它会以你的方式工作打算。

我不知道你以后在哪里使用它们,但是你会想要

NSArray *keys, *values;

摆脱错误。