All documentationand examplesはソケットのCFSocketCallBack
コールアウトが4分の1(data
)がソケットから先読みすべてのデータを含むCFData
オブジェクトにキャストすることができることを意味し、2番目のパラメータ(callbackType
)として.dataCallback
を与えられた場合と言います。SwiftでCFSocketCallBackType.dataCallbackを処理するにはどうすればよいですか?
私はこれをしようとする場合しかし、それは失敗します。
private func myCallout(socket: CFSocket?,
callBackType: CFSocketCallBackType,
address: CFData?,
callBackTypeMetaData: UnsafeRawPointer?,
info: UnsafeMutableRawPointer?) -> Void {
// Behavior inferred from Developer
// https://developer.apple.com/documentation/corefoundation/cfsocketcallback
guard
let info = info,
let socket = socket
else {
return assertionFailure("Socket may have gone out of scope before response")
}
// <REDACTED>
if callBackType == .dataCallBack {
guard let data = callBackTypeMetaData?.load(as: CFData.self) else {
return assertionFailure("Data Callback's metadata was not a CFData object")
}
foo(data as Data) // Crashes here
}
// <REDACTED>
}
私が手にクラッシュがこれです:デバッガで
Thread 1: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0).
、私はこれを入力すると:
(lldb) po callBackTypeMetaData!.load(as: CFData.self)
ポインタアドレスを出力するだけです(どちらかといえば、2つの意味があります。0
)。私はこのタイプしかし、:
(lldb) po callBackTypeMetaData!.load(as: CFData.self) as Data
をそれは、これを出力します。
error: Execution was interrupted, reason: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0).
The process has been returned to the state before expression evaluation.
だから、本当にCFData
ではありませんが、それは表面上のそれに似ているようだのに十分近いです私が得たものと思われます何かが実際にそのように読むことを試みるまで。
ここで何が起こっているのですか。私のデータはどこにありますか?これはどのように修正できますか?
:何が欲しいのは
CFData
(またはNSData
)ポインタとして生のポインタを「再解釈」することです!しかし、私はなぜそれほど理解できないのですか...「ポインタのアドレスでメモリを扱うのは、ある種のものとして生ポインタを再解釈する」と同じであると考えました。これらの2つのアプローチはどのように異なっていますか?また、今後どのようにこの違いを知ることができますか? –また、デバッガで 'data'を出力すると、バイト数が0で、ポインタが毎回0x000000000000bad0となります。 –
@BenLeggiero:あなたのコードは' callBackTypeMetaData! 'がポイントします。私のコードは単に 'callBackTypeMetaData! 'の値に' data'を割り当て、残りはコンパイラの型キャストです。ドキュメンテーションでは、未加工のポインタはCFDataオブジェクトであり、CFDataオブジェクトを指しているわけではありません。 –