1

私はメモリリークを避けるために ARC でからCFStringRefに移動する正しい方法を探していました。NSString

NSString * string = (__bridge NSString *)cfString;

ここではそのアプローチを使用していますが、アプリのプロファイリングを行うと、この小さなメソッドでまだメモリ リークが発生します [添付の画像を参照]。

したがって、これを修正する方法がわかりません。誰でもこの問題の解決策を持っていますか?

ありがとうございました

ここに画像の説明を入力

ここに画像の説明を入力

そのため、明らかCFRelease(ext)にリターンの前にを追加すると、リークが修正されました。問題は、私がその理由を完全に理解していないと思うことです。私は次の行だと思った:

NSString * extension = (__bridge NSString*)ext

Core Foundation ext 文字列の所有権を取得し、リリースを処理します。ここで何が起こっているのかを正確に説明できる人はいますか?

4

2 に答える 2

7

事実上の「標準」Cocoa命名規則に従って、CreateまたはCopyその名前に含まれる関数は、参照カウント1のオブジェクトを返します。ARCが処理できるように、この参照カウントをARCランドに転送する必要があります。__bridge_transferこの目的のためにキーワードを使用します。

NSString *string = (__bridge_transfer NSString *)cfString;
于 2013-07-31T10:13:25.050 に答える
4

extオブジェクトを解放するか、 を使用して__bridge_transferください。

これを私が理解している方法で少し説明しましょう。

  • __bridge– 通常のキャスト。キャストされたオブジェクトの保持カウントは、ARC によって部分的に管理され、部分的に手動で管理されます。側で既存の所有権を解放する必要がありますCF

  • __bridge_transfer– 「CFオブジェクトをNSオブジェクトに変換します。」キャストされたオブジェクトの保持カウントは、ARC によって完全に管理されます。側の既存の所有権CFはあなたのために処分されます。

于 2013-07-31T10:13:18.407 に答える