1

我正在获取联系方式,并且在我的 shouldContinueAfterSelectingPerson 方法中存在内存问题。我在几周前遵循了一个教程,但是现在当我单击产品-> 分析时,我在这 3 行中得到“在线分配的对象的潜在泄漏”:

[lastName setText:(__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty)];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

[dateOfBirth setText:birthday];

单击这些错误时,我得到(尽管第三行只有 2 号):

  1. 调用函数“ABRecordCopyValue”返回一个具有 + 1 保留计数的 Core Foundation 对象

  2. 对象泄漏:在此执行路径中稍后未引用分配的对象,并且保留计数为 + 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。

4

2 回答 2

8

你要这个:

[lastName setText:(__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty)];

您看到来自分析器的警告的原因是ABRecordCopyValue返回一个CFStringRef+1 保留计数。然后,您将投射到一个NSString*但对 ARC 说不要拥有该对象的所有权。这意味着它不会自动为您添加版本。因此,您需要告诉 ARC 在使用__bridge_transfer.

你也可以这样做:

CFStringRef string = ABRecordCopyValue(person, kABPersonLastNameProperty);
[lastName setText:(__bridge NSString *)string];
CFRelease(string);
于 2012-07-21T17:13:12.477 回答
1

由于函数正在返回新对象(它们的名称中有副本),因此您需要以某种方式释放这些对象。

这可以通过调用适当的方法来释放它,或者通过使用__bridge_transferinstead of 来完成__bridge,它指示 ARC 接管内存管理并在需要时释放它。

于 2012-07-21T17:14:55.080 回答