2012-04-09 13 views
0

AddressBookからNotesを取得するコードです。アドレス帳からNotesを取得するとアプリケーションがクラッシュする

+(NSString*)getNote:(ABRecordRef)record { 

    return ABRecordCopyValue(record, kABPersonNoteProperty); 
} 

しかし、上記の実装ではメモリリークがあります。だから私は、コード

+(NSString*)getNote:(ABRecordRef)record { 

    NSString *tempNotes = (NSString*)ABRecordCopyValue(record, kABPersonNoteProperty); 
    NSString *notes = [NSString stringWithString:tempNotes]; 
    [tempNotes release]; 
    return notes; 

} 

私は上記のコード記述する場合私のアプリがクラッシュし、次の書いたメモリリークを削除します。何がうまくいかない?ありがとう。

UPDATE:次のように私は、このメソッドを呼び出します。

notes = [AddreesBook getNote:record]; 

ノートは、私はdeallocメソッドでそれを解放しています私のIVAR &です。

+0

それがクラッシュしたときに、それは何と言っています...詳細について – EmilioPelaez

答えて

1

あなたの最初の実装は、所有権のルール違反:

Memory Management Rules

言うことです、APIを使用している呼び出すと、「コピー」が含まれていますが、自動解放オブジェクトのようにそれを処理しています。

あなたが修正された実装で自動リリースされたオブジェクトを返すとすれば、返されたノート文字列を保持していないと思われます。デバッガでアプリケーションを実行しているときにアプリがクラッシュした場合は、NSPopAutoreleasePool()であるかどうかを確かめることができます。

簡単なテストは、あなたが戻って取得し、クラッシュが消えるかどうかを確認し、ノートオブジェクトに-retainを送信するには、次のようになります?

NSString *note = [ MyAddressBook getNote: abRecord ]; 

[ note retain ]; 
/* ... use note ... */ 

/* we retained the object, we must also release it when done with it. */ 
[ note release ]; 
+0

感謝。私はあなたの解決策をチェックします。 – iOSAppDev

0

recordパラメータが正しく設定されていると仮定すると、次のように自動解放されたNSStringが返されます。 getNoteの現在のバージョンが動作していない理由を

+ (NSString *)getNote:(ABRecordRef)record { 
    return [(NSString *)ABRecordCopyValue(record, kABPersonNoteProperty) autorelease]; 
} 

しかし、私は現在、見ていませんよ。

関連する問題