1

次のコードで警告が表示されます。

NSString *userMail = (__bridge NSString *) contactInfo;
CFRelease(contactInfo);

// Persist the user mail in NSUserDefaults
[[SettingsHelper sharedInstance] setUserMail:userMail];

リリース後contactInfoはもう参照していないので、警告がよくわかりません。

4

2 に答える 2

0

userMail は contactInfo オブジェクトへの単なる参照です。userMail の呼び出しは、contactInfo の呼び出しに似ています。ここで contactInfo を解放し、userMail (contactInfo への参照) を settingsHelper の userMail として設定しようとします。

この方法を試して、

NSString *userMail = (__bridge NSString *) contactInfo;

// Persist the user mail in NSUserDefaults
[[SettingsHelper sharedInstance] setUserMail:userMail];
CFRelease(contactInfo);
于 2013-02-25T13:48:27.310 に答える
0

ブリッジされたキャストは、ARC の制御内外に何かを転送しますが、ARC が別の場所に保持されていると想定するポインターを提供します。

代替案 1 (醜い)

通常の を使用すると、オブジェクトを使い__bridge終わるまでオブジェクトを解放できません。

NSString *userMail = (__bridge NSString *) contactInfo;
[[SettingsHelper sharedInstance] setUserMail:userMail];
CFRelease(contactInfo);

代替案 2 (いいね)

を使用する__bridge_transferと、ARC が追跡します。

NSString *userMail = (__bridge_transfer NSString *) contactInfo;
[[SettingsHelper sharedInstance] setUserMail:userMail];

概要

キャストは、__bridge参照カウント型を非参照カウント型にキャストする場合にのみ使用してください。たとえば、 ~ のvoid *NSString *。たとえば、C でコールバック関数を記述するために使用する必要があります。

キャストにより、ある参照カウント型からto__bridge_transferなどの別の型に変換できます。CFStringRefNSString *

于 2013-02-25T13:49:55.613 に答える