我遇到了NSMutableArray
的问题。我用它来存储地址簿的联系方式。我在地址簿中有300个联系人。
但我的应用程序将崩溃。我使用过这段代码
+(NSMutableArray *)getcontactdetails
{
ABAddressBookRef addressBook;
CFArrayRef allSources;
NSMutableArray *list = [[NSMutableArray alloc] init];
addressBook = ABAddressBookCreate();
ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook);
allSources = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonFirstNameProperty);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
if(nPeople != 0){
for (CFIndex i = 0; i < nPeople; i++)
{
//common field
NSString *first_name =[[[NSString alloc] init] autorelease];
contact_details *phone_book_data=[[contact_details alloc] init];
ABRecordRef aSource = CFArrayGetValueAtIndex(allSources,i);
CFStringRef firstName = ABRecordCopyValue(aSource, kABPersonFirstNameProperty);
first_name=[NSString stringWithFormat:@"%@",firstName];
if ([first_name isEqualToString:@"(null)"] || first_name == nil || first_name.length == 0) {
}
else{
phone_book_data.FirstName=[NSString stringWithFormat:@"%@",first_name];
}
[list addObject:phone_book_data];
phone_book_data=nil;
[phone_book_data release];
}
CFRelease(allSources);
}
[self current_function_name:@"Finished getcontactdetails"];
return list;
}
我在控制台上有这些:
Sep 3 23:09:20 iPhone ReportCrash [1378]:制定流程的崩溃报告[1373] 9月3日23:09:21 iPhone com.apple.launchd [1](UIKitApplication:com.inTooch.inTooch [0x6b8a] [1373]):( UIKitApplication:com.inTooch.inTooch [0x6b8a])作业似乎崩溃了:分段错误:11 9月3日23:09:21 iPhone SpringBoard [52]:应用程序'inTooch'异常退出,信号11:分段错误:11 9月3日23:09:21 iPhone ReportCrash [1378]:libMobileGestalt computeUniqueDeviceID:bb返回imei的总时间:0
我是如何解决这个问题的?
提前致谢.....
答案 0 :(得分:1)
你在这里泄漏记忆:
CFStringRef firstName = ABRecordCopyValue(aSource, kABPersonFirstNameProperty);
first_name=[NSString stringWithFormat:@"%@",firstName];
完全摆脱第二行,它所做的就是引入内存泄漏。
这里的释放毫无意义:
phone_book_data=nil;
[phone_book_data release];
由于您首先将nil
指定给指针,因此您正在泄漏其指向的对象的内存。交换这些线。
您还需要重命名此方法以指示调用代码拥有生成的对象。
你真的需要阅读内存管理。首先运行静态分析器,它应该用这段代码标出许多问题,并且在你意识到每个警告的原因之前不要停止阅读。