問題タブ [toll-free-bridging]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - CFIndex を NSInteger に変換する
この質問は私の質問に似ていますが、回答が含まれていません。CFIndex
を に変換したいNSInteger
。フリーダイヤルのブリッジングを行うタイプのリストを確認しましたが、これはそれらの 1 つではありません。
objective-c - ARCでのNSFastEnumerationオブジェクトのキャスト
カスタム クラスでNSFastEnumerationcountByEnumeratingWithState:objects:count:
プロトコルのメソッドを実装しようとしています。
これまでのところ、オブジェクトを正しく反復処理していますが、返されるオブジェクトは Objective-C オブジェクトではなく、コアとなる基盤の同等物です。
state->itemsPtr を設定するコードの一部を次に示します。
MyCustomCollection.m
次に、このように「for..in」ループを別の場所で呼び出します
SomeOtherClass.m
コンソール出力は次のとおりです。
ご覧のとおり、NSFastEnumeration プロトコル メソッド内では、オブジェクトは正常に出力されますが、キャストされるとすぐにid __unsafe_unretained *
、元の Objective-C 対応クラスが失われます。
正直なところ(__unsafe_unretained id *)(__bridge void *)
、この場合のキャスティングがどのように機能するかはよくわかりません。は(__unsafe_unretained id *)
、適切なタイプの itemsPtr のニーズに一致するようにキャストされているようです。は(__bridge void *)
、obj-c ワールドを CF ワールドにブリッジするために使用される __bridge を使用して、タイプ void のポインターにキャストするようです。llvm docsに従って、次の場合__bridge
:
所有権の譲渡はなく、ARC は保持操作を挿入しません。
あれは正しいですか?
私の理解では、__NSCFConstantString は NSString に相当するコア基盤にすぎません。また、ARC では、Objective-C オブジェクトから同等の CoreFoundation オブジェクトにブリッジする必要があることも理解しています。これは、ARC が後者のメモリを管理する方法を知らないためです。
「for..in」ループ内のオブジェクトが元のタイプになるようにするにはどうすればよいですか?
また、この場合、コレクションに NSStrings を追加していますが、理論的にはすべてのオブジェクトをサポートする必要があることに注意してください。
アップデート
ロブの答えは正しい軌道に乗っていますが、その理論をテストするために、for ループを次のように変更しました。
理論的には、オブジェクトは同等であるため機能するはずですが、次のエラーでクラッシュします。
ループで返されるオブジェクトは、for
インスタンスではなくクラスのように見えます。ここで何か他のことが間違っているかもしれません...これについて何か考えはありますか?
更新 2: ソリューション
次のように簡単です: (CodaFi のおかげで
objective-c - ARC で NSString から CFStringRef へ、および CFStringRef から NSString へ?
ARCNSString
からを取得する正しい方法を理解しようとしていますか? CFStringRef
反対方向に行く場合も同じでCFStringRef
、NSString
ARC に移動しますか?
メモリリークを発生させずにこれを行う正しい方法は何ですか?
callback - OS X と FSEvents: FSEventStreamRef に提供されたコールバック ポインタをどのように解放しますか?
FSEvents を使用してディレクトリを監視しています。ディレクトリが変更されるたびに、FSEventStreamRef の FSEventStreamContext に最初に渡したブロックを呼び出します。ディレクトリの監視を停止するときにブロックを解放するにはどうすればよいですか? 参考までに以下のコード。
objective-c - CF 以外のタイプの ARC に出入りするために、一致する CFBridging 呼び出しを使用しても安全ですか?
userData
Chipmunk 物理エンジンを使用してゲームを作成しています。Objective-C オブジェクトへのポインターをすべてのボディフィールドに格納したいと考えています。id
と の間でキャストするにはブリッジング キャストを使用する必要があることはわかっていますがvoid *
、その方法が安全かどうかはわかりません。
CFBridging*()
このコードは機能しているように見えますが、Core Foundation 型に無料でブリッジできるオブジェクトでのみ使用することになっていることも読みました。はからUserData
派生したものNSObject
であり、無料のブリッジ タイプNSObject
のリストに含まれていないため、そのルールを破っているようです。
最終的に呼び出しCFBridgingRelease
てオブジェクトを他の Core Foundation 関数に渡そうとしないため、コードは問題ありませんか、または C 内外で Objective-C オブジェクトを転送する別の方法がありますか?
objective-c - ARC: contextInfo テスト ケースを使用した __bridge と __bridge_retained の比較
次の ARC コードを検討してください。
質問: 7 行目で、 を__bridge
使用する必要がありますか、 または__bridge_retained
、またはそれは問題ではありませんか、それとも文字列の保持カウント (つまり、文字列が明示的に割り当てられているか、 のようなクラス初期化子を介して自動解放されているか) に依存します+[NSString stringWithString:]
か?
objective-c - Swift での無料のブリッジングとポインター アクセス
アプリを Objective-C から Swift に移植していますが、次の方法を使用する必要があります。
古いロジックは次のようになります (いくつかの Web サイトが同意しているようです)。
フリーダイヤルのブリッジングのおかげで、これはうまく機能します。ただし、「Swift-space」には ARC が存在せず、型システムが変更されています。
ストリームをインスタンスに変換するにはどうすればよいですか
そして、呼び出しNSStream
後にそれらをサブクラスに変換しますか?CFStreamCreatePairWithSocketToHost