2011-03-15 13 views
4

ABMultiValueRef放出、静的アナライザ点次のコードのリーク:自分のアプリケーション内のオブジェクト

ABMultiValueRef phone = (NSString *)ABRecordCopyValue(person, kABPersonPhoneProperty); 
NSString *mobilephone= (NSString*)ABMultiValueCopyValueAtIndex (phone,0); 

同様に、それは私が[phone release];方法でそれを解放しようとしたリーク

ポイントABRecordCopyValue私はこの機能を使用するたびにしかし、私はコンパイラ警告 "無効な受信者の種類 'abmultivalueref'を取得しています。これを解放する適切な方法は何ですか?

答えて

5

です。アドレス帳メソッドは、通常、コア基底(CF)オブジェクトを返します。これらのオブジェクトはフリーダイヤルです。つまり、NSタイプと互換的に使用できます。

コアの基礎オブジェクトを使用する場合、その名前に 'copy'を持つメソッドは、後で解放する必要があるオブジェクトを返します。CFReleaseを使用します。 NS相当にキャストした場合にのみ、- releaseを使用できます。

だからあなたのコードは、次のいずれかのように書くことができます:__bridge_transferを使用して

ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty); 
NSString *mobilephone = (NSString *)ABMultiValueCopyValueAtIndex(phone, 0); 

// other code 

[mobilephone release]; 

または

ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty); 
CFStringRef mobilephone = ABMultiValueCopyValueAtIndex(phone, 0); 

// other code 

CFRelease(mobilephone); 
1

CFRelease(phone);で試しましたか?
ABMultiValueCopyValueAtIndexはNSStringのではないので、それはあなたがCFデータ型のNSデータ型が混乱しているように見えますCFStringRef

1

は、ARCがあなたのためにオブジェクトを解放するようになります。 __bridgeを使用すると、返されたオブジェクトを手動で解放する必要があることを意味します。