0

私は構造体ivarの「プレーンな」C配列ですCFURLRef。これを と呼びますsourceURLArray。6 つの要素を保持するように初期化します。

後で、関数でオブジェクトを作成 (割り当て/初期化) しNSURL*ます。私はそれを呼び出しfileURL、そのオブジェクトのコピーを前述の配列の最初の要素に保存したいと考えています。私がする必要があるのはこれだけだと思いました:

        sourceURLArray[0] = (__bridge CFURLRef)([fileURL copy]);

ただし、コードを実行すると、関数を介して 2 回目の割り当て解除されたインスタンス メッセージにメッセージが送信されます。変数を調べると、上記の行が実行された後、sourceURLArray[0]は と同じアドレスを保持しますfileURL。関数が完了すると範囲外になるためfileURL、アドレスのsourceURLArray[0]割り当てが解除されます。

コピー、無料のブリッジングのニュアンス、またはその両方について、何か基本的なことを誤解しているようです。

4

1 に答える 1

1

試す:

sourceURLArray[0] = (__bridge_retained CFURLRef)([fileURL copy]);

また:

sourceURLArray[0] = (CFURLRef)CFBridgingRetain([fileURL copy]);

これにより、所有権を別のアレイに譲渡することが ARC に通知されます。CFURLRefある時点で でCFRelease を適切に呼び出す必要があります。

于 2012-12-07T19:55:51.130 に答える