0

で問題が発生してい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;
 }

私はコンソールでこれらを持っています:

9 月 3 日 23:09:20 iPhone ReportCrash[1378] : プロセス intooch[1373] のクラッシュ レポートを作成中 9 月 3 日 23:09:21 iPhone 1373]) : (UIKitApplication:com.inTooch.inTooch[0x6b8a]) ジョブがクラッシュしたようです: セグメンテーション違反: 11 Sep 3 23:09:21 iPhone SpringBoard[52]: アプリケーション 'inTooch' がシグナル 11 で異常終了しました: セグメンテーションfault: 11 Sep 3 23:09:21 iPhone ReportCrash[1378]: libMobileGestalt computeUniqueDeviceID: bb が imi を返す合計時間: 0

その問題をどのように修正しましたか?

前もって感謝します.....

4

1 に答える 1

1

ここでメモリをリークしています:

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

2 行目を完全に削除するだけで、メモリ リークが発生するだけです。

ここでのリリースは無意味です。

phone_book_data=nil;
[phone_book_data release];

最初にポインターに割り当てるnilため、ポインターが指しているオブジェクトのメモリをリークしています。これらの行を入れ替えます。

また、呼び出し元のコードが結果のオブジェクトを所有していることを示すために、このメソッドの名前を変更する必要があります。

あなたは本当にメモリ管理について読む必要があります。静的アナライザーを実行することから始めます。このコードの多くの問題にフラグが立てられるはずです。各警告の原因がわかるまで、読むのをやめないでください。

于 2012-09-04T15:10:24.070 に答える