次のコードで警告が表示されます。
NSString *userMail = (__bridge NSString *) contactInfo;
CFRelease(contactInfo);
// Persist the user mail in NSUserDefaults
[[SettingsHelper sharedInstance] setUserMail:userMail];
リリース後contactInfo
はもう参照していないので、警告がよくわかりません。
次のコードで警告が表示されます。
NSString *userMail = (__bridge NSString *) contactInfo;
CFRelease(contactInfo);
// Persist the user mail in NSUserDefaults
[[SettingsHelper sharedInstance] setUserMail:userMail];
リリース後contactInfo
はもう参照していないので、警告がよくわかりません。
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);
ブリッジされたキャストは、ARC の制御内外に何かを転送しますが、ARC が別の場所に保持されていると想定するポインターを提供します。
通常の を使用すると、オブジェクトを使い__bridge
終わるまでオブジェクトを解放できません。
NSString *userMail = (__bridge NSString *) contactInfo;
[[SettingsHelper sharedInstance] setUserMail:userMail];
CFRelease(contactInfo);
を使用する__bridge_transfer
と、ARC が追跡します。
NSString *userMail = (__bridge_transfer NSString *) contactInfo;
[[SettingsHelper sharedInstance] setUserMail:userMail];
キャストは、__bridge
参照カウント型を非参照カウント型にキャストする場合にのみ使用してください。たとえば、 ~ のvoid *
間NSString *
。たとえば、C でコールバック関数を記述するために使用する必要があります。
キャストにより、ある参照カウント型からto__bridge_transfer
などの別の型に変換できます。CFStringRef
NSString *