2012-01-12 10 views
1

現在、アドレスブックからすべての連絡先を取得しており、特定の連絡先に最後に連絡した日付を保存したいと考えています。したがって、私は次のように同時にカレンダーを取り出している:ABRecordCopyValue()SIGSEGV

for (EKEvent* event in events) { 
      for (EKParticipant* attende in [event attendees]) { 
       ABRecordRef record = [attende ABRecordWithAddressBook:addressBook]; 
       if([contact.name isEqualToString:[NSString stringWithFormat:@"%@ %@", (__bridge NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty), (__bridge NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty)]]){ 
         contact.lastMet = [NSString stringWithFormat:@"%@",[formatter stringFromDate:event.endDate]]; 
        } 

      } 

     } 

信号SIGSEGVと「IF」-statement線で悲しいコードがクラッシュすると、クラッシュログ)(障害がABRecordCopyValueで起こることを示しています。 ..どのような提案をこの問題を解決するには?

+2

エラーが発生した場合は 'record' nilですか? 'ABRecordWithAddressBook'の戻り値は'参加者のアドレス帳レコードです。もしレコードが見つからなければnilです.'レコードがnilならコピー操作が失敗するかもしれません。 – ikuramedia

答えて

5

あなたは完全なコードを投稿していないので、自分で問題をデバッグすることはできません。しかし、私は答えがコメントでikuragamesによって与えられると思います。クラッシュの最も可能性の高い原因は、コードが実行されているときにレコードがnullである可能性があります。コードを破って、レコードとkABPersonFirstNamePropertyの値を確認してください。レコードの初期値を割り当てるか、必要に応じてコードを変更する必要があります。問題が解決しない場合は、デバッグ情報を少し詳しく説明してください。

:)

あなたは単にif文の先頭に非nilをされたレコードをテストすることができます

1

...ありがとう。テストが失敗した場合、残りの式は評価されません。だから次のあなたのクラッシュを治す必要があります。

for (EKEvent* event in events) { 
     for (EKParticipant* attende in [event attendees]) { 
      ABRecordRef record = [attende ABRecordWithAddressBook:addressBook]; 
      if(record && [contact.name isEqualToString:[NSString stringWithFormat:@"%@ %@", (__bridge NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty), (__bridge NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty)]]){ 
        contact.lastMet = [NSString stringWithFormat:@"%@",[formatter stringFromDate:event.endDate]]; 
       } 
     } 
    }