[英]Fix Potential leak of an object
当我使用构建和分析时,出现泄漏(它显示为对象的潜在泄漏)。 修复我包括如下
if ( aContactfirstName){
CFRelease(aContactfirstName);
}
if (aContactLastName){
CFRelease(aContactLastName);
}
但是我的应用崩溃了。
因此,请让我知道泄漏的地方并加以解决。
-(NSString*)getContactNameByPhoneNo:(NSString*)phoneNO{
NSString *aContactName = phoneNO;
ABAddressBookRef addressbook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressbook);
CFIndex numPeople = ABAddressBookGetPersonCount(addressbook);
for (int i=0; i < numPeople; i++) {
ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
ABMutableMultiValueRef phonelist = ABRecordCopyValue(person, kABPersonPhoneProperty);
CFIndex numPhones = ABMultiValueGetCount(phonelist);
for (int j=0; j < numPhones; j++) {
CFTypeRef ABphone = ABMultiValueCopyValueAtIndex(phonelist, j);
NSString *personPhone = (NSString *)ABphone;
NSLog(@"i am:");
personPhone =[personPhone stringByReplacingOccurrencesOfString:@"-"withString:@""];
personPhone=[personPhone stringByReplacingOccurrencesOfString:@")"withString:@""];
personPhone=[personPhone stringByReplacingOccurrencesOfString:@" "withString:@""];
personPhone=[personPhone stringByReplacingOccurrencesOfString:@"("withString:@""];
personPhone=[personPhone stringByReplacingOccurrencesOfString:@"+"withString:@""];
NSLog(@"xcxcxcxc");
CFRelease(ABphone);
if ( [personPhone isEqualToString:phoneNO] ){
NSString *aContactfirstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty) ;
NSString *aContactLastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty) ;
if ( aContactLastName != NULL && aContactfirstName != NULL){
aContactName = [NSString stringWithFormat:@"%@ %@",aContactfirstName,aContactLastName];
}
else if(aContactfirstName != NULL){
aContactName = aContactfirstName;
}
else if(aContactLastName != NULL){
aContactName = aContactLastName;
}
if ( aContactfirstName){
CFRelease(aContactfirstName);
}
if (aContactLastName){
CFRelease(aContactLastName);
}
break;
}
}
CFRelease(phonelist);
}
CFRelease(allPeople);
CFRelease(addressbook);
return aContactName;
}
采用 -
NSString *aContactfirstName = [(NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty) autorelease];
NSString *aContactLastName = [(NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty) autorelease];
if(aContactLastName != NULL){
aContactName = aContactLastName;//aContactName pointing to aContactLastName
}
在此,您将aContactLastName分配给aContactName(aContactLastName和aContactName指向相同的内存位置)。 然后释放一个ContactLastName。
if (aContactLastName){
CFRelease(aContactLastName);
}
然后您返回return aContactName;
(aContactName已经发布),这是错误的。
去掉
if (aContactLastName){
CFRelease(aContactLastName);
}
从您的代码中返回[aContactName autorelease];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.