我收到了联系方式,并且在我的shouldContinueAfterSelectingPerson方法中遇到了内存问题。我遵循了一个教程并在几周前完成了,但现在当我点击Product - >分析我在这三行上得到“在线分配的对象的潜在泄漏”:
[lastName setText:(__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty)];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateOfBirth setText:birthday];
当我点击这些错误时(虽然第三行只有2号):
调用函数'ABRecordCopyValue'返回一个带有+ 1保留计数的Core Foundation对象
对象泄露:此执行路径中未引用已分配的对象,并且保留计数为+ 1
完整代码如下所示:
- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {
[firstName setText:(__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty)];
[lastName setText:(__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty)];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMMM d, yyyy"];
birthday = [dateFormatter stringFromDate:(__bridge NSDate *)ABRecordCopyValue(person, kABPersonBirthdayProperty)];
[dateOfBirth setText:birthday];
有没有解决这个问题,我修复它有多重要?我的代码中还有另一个潜在的对象泄漏。
最后一点:我正在使用ARC。
答案 0 :(得分:8)
你想要这个:
[lastName setText:(__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty)];
您看到分析师发出警告的原因是ABRecordCopyValue
会返回CFStringRef
并保留+1个保留计数。然后你转向NSString*
但是对ARC说不要取得对象的所有权。这意味着它不会自动为您添加版本。因此,您需要告诉ARC在使用__bridge_transfer
进行Objective-C对象着陆时获取所有权。
你也可以做到:
CFStringRef string = ABRecordCopyValue(person, kABPersonLastNameProperty);
[lastName setText:(__bridge NSString *)string];
CFRelease(string);
答案 1 :(得分:1)
由于函数返回新对象(它们在名称中有副本),因此需要以某种方式释放这些对象。
这可以通过调用适当的方法来释放它,或者使用__bridge_transfer
而不是__bridge
来完成,它指示ARC接管内存管理并在需要时释放它。