我收到以下错误
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;
}
答案 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;
摆脱错误。