[解決済み] ARCでNSStringからCFStringRef、CFStringRefからNSString?
質問
を取得する正しい方法を理解しようとしています。
NSString
から
CFStringRef
をARCで使うのですか?
反対方向に行く場合も同じです。
CFStringRef
から
NSString
をARCで使うか?
メモリリークを発生させない正しい方法は何ですか?
どのように解決するのですか?
一般的に
NSString *yourFriendlyNSString = (__bridge NSString *)yourFriendlyCFString;
と
CFStringRef yourFriendlyCFString = (__bridge CFStringRef)yourFriendlyNSString;
さて、もしあなたが、なぜ
__bridge
キーワードがある理由を知りたい場合は
アップルのドキュメント
. そこに書いてあります。
__bridge
は、Objective-C と Core Foundation の間で、所有権の移動なしにポインタを転送します。
__bridge_retained
またはCFBridgingRetain
は Objective-C ポインタを Core Foundation ポインタにキャストし、また所有権をあなたに移します。 あなたはオブジェクトの所有権を放棄するためにCFReleaseまたは関連する関数を呼び出す責任があります。
__bridge_transfer
またはCFBridgingRelease
は非Objective-CのポインタをObjective-Cに移動し、所有権もARCに移します。 ARCはオブジェクトの所有権を放棄する責任があります。
つまり、上記のケースでは、所有権を変更せずにオブジェクトをキャストしていることになります。 これは、どちらの場合も文字列のメモリを処理する責任があることを意味します。
また、何らかの理由で所有権を移したいというケースもあるかもしれません。
例えば、次のようなスニペットを考えてみましょう。
- (void)sayHi {
CFStringRef str = CFStringCreateWithCString(NULL, "Hello World!", kCFStringEncodingMacRoman);
NSString * aNSString = (__bridge NSString *)str;
NSLog(@"%@", aNSString);
CFRelease(str); //you have to release the string because you created it with a 'Create' CF function
}
を保存しておくとよいでしょう。
CFRelease
をキャストする際に所有権を移すことで
- (void)sayHi {
CFStringRef str = CFStringCreateWithCString(NULL, "Hello World!", kCFStringEncodingMacRoman);
NSString * aNSString = (__bridge_transfer NSString *)str;
// or alternatively
NSString * aNSString = (NSString *)CFBridgingRelease(str);
NSLog(@"%@", aNSString);
}
の所有者は
str
の所有権が移りましたので、ARC が起動し、メモリを解放してくれるようになりました。
他の方法として、あなたは
NSString *
を
CFString
を使って
__bridge_retained
を使用すると、オブジェクトを所有することになり、明示的に
CFRelease
.
最後に、あなたは
NSString → CFString
// Don't transfer ownership. You won't have to call `CFRelease`
CFStringRef str = (__bridge CFStringRef)string;
// Transfer ownership (i.e. get ARC out of the way). The object is now yours and you must call `CFRelease` when you're done with it
CFStringRef str = (__bridge_retained CFStringRef)string // you will have to call `CFRelease`
CFString → NSString
// Don't transfer ownership. ARC stays out of the way, and you must call `CFRelease` on `str` if appropriate (depending on how the `CFString` was created)
NSString *string = (__bridge NSString *)str;
// Transfer ownership to ARC. ARC kicks in and it's now in charge of releasing the string object. You won't have to explicitly call `CFRelease` on `str`
NSString *string = (__bridge_transfer NSString *)str;
関連
-
[解決済み] Objective-Cの定数
-
[解決済み] プロジェクト内の単一ファイルのARCを無効にするにはどうしたらいいですか?
-
[解決済み] performSelectorのセレクタが不明なため、リークが発生する可能性があります。
-
[解決済み] NSStringをNSNumberに変換する方法
-
[解決済み】Objective-C ARC: strong vs retainとweak vs assign
-
[解決済み】Objective-Cの自動参照カウントでは、どのようなリークを防いだり最小化したりできないのですか?
-
[解決済み】ARCで@autoreleasepoolがまだ必要なのはなぜですか?
-
[解決済み] 警告 "format が文字列リテラルでなく、format の引数がない場合"
-
[解決済み] Objective-Cでの文字列比較
-
[解決済み] NSAutoreleasePoolのオートリリース・プールはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 角括弧 < > と引用符 " " を使って #import する。
-
[解決済み] RootViewControllerのスイッチングアニメーション
-
[解決済み] NSPredicate: NSDateプロパティの日によるオブジェクトのフィルタリング
-
[解決済み] 2つの日付の差を計算するにはどうすればよいですか?
-
[解決済み] インスタンスメッセージの受信型'CALayer'は前方宣言である」とはどういう意味か?
-
[解決済み] NSDictionaryにboolean値を追加するにはどうすればよいですか?
-
[解決済み] BOOLプロパティの使用
-
[解決済み] Objective-CでQueueを作成し、使用するにはどうすればよいですか?
-
[解決済み] Xcode リンカエラー: file too small for architecture x86_64
-
[解決済み] NSIntegerをint型に変換するには?