应用程序因NSMutableArray而崩溃

时间:2012-09-04 14:54:15

标签: iphone nsmutablearray abaddressbook

我遇到了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

我是如何解决这个问题的?

提前致谢.....

1 个答案:

答案 0 :(得分:1)

你在这里泄漏记忆:

CFStringRef firstName = ABRecordCopyValue(aSource, kABPersonFirstNameProperty);
first_name=[NSString stringWithFormat:@"%@",firstName];

完全摆脱第二行,它所做的就是引入内存泄漏。

这里的释放毫无意义:

phone_book_data=nil;
[phone_book_data release];

由于您首先将nil指定给指针,因此您正在泄漏其指向的对象的内存。交换这些线。

您还需要重命名此方法以指示调用代码拥有生成的对象。

你真的需要阅读内存管理。首先运行静态分析器,它应该用这段代码标出许多问题,并且在你意识到每个警告的原因之前不要停止阅读。

相关问题