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

Pat*_*ick 1 memory iphone xcode

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

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

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

[dateOfBirth setText:birthday];
Run Code Online (Sandbox Code Playgroud)

当我点击这些错误时(虽然第三行只有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];
Run Code Online (Sandbox Code Playgroud)

有没有解决这个问题,我修复它有多重要?我的代码中还有另一个潜在的对象泄漏.

最后一点:我正在使用ARC.

mat*_*way 8

你要这个:

[lastName setText:(__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty)];
Run Code Online (Sandbox Code Playgroud)

您看到分析仪发出警告的原因是ABRecordCopyValue返回CFStringRef+1保留计数.然后你会向一个人投掷,NSString*但是对ARC说不要取得对象的所有权.这意味着它不会自动为您添加版本.因此,您需要告诉ARC在演员阵容期间获得所有权,使用的是Objective-C对象__bridge_transfer.

你也可以做到:

CFStringRef string = ABRecordCopyValue(person, kABPersonLastNameProperty);
[lastName setText:(__bridge NSString *)string];
CFRelease(string);
Run Code Online (Sandbox Code Playgroud)