在线分配的对象的潜在泄漏......

时间:2012-07-21 15:28:46

标签: iphone xcode memory

我收到了联系方式,并且在我的shouldContinueAfterSelectingPerson方法中遇到了内存问题。我遵循了一个教程并在几周前完成了,但现在当我点击Product - >分析我在这三行上得到“在线分配的对象的潜在泄漏”:

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

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

[dateOfBirth setText:birthday];

当我点击这些错误时(虽然第三行只有2号):

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

  2. 对象泄露:此执行路径中未引用已分配的对象,并且保留计数为+ 1

  3. 完整代码如下所示:

    - (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。

2 个答案:

答案 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接管内存管理并在需要时释放它。