2017-12-12 13 views
1

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ではありませんが、それは表面上のそれに似ているようだのに十分近いです私が得たものと思われます何かが実際にそのように読むことを試みるまで。

ここで何が起こっているのですか。私のデータはどこにありますか?これはどのように修正できますか?

答えて

1
data = callBackTypeMetaData!.load(as: CFData.self) 

そのcallBackTypeMetaData!点にメモリ位置からCFDataポインタを読み出します。間違いなくクラッシュを解消

+0

:何が欲しいのは CFData(またはNSData)ポインタとして生のポインタを「再解釈」することです!しかし、私はなぜそれほど理解できないのですか...「ポインタのアドレスでメモリを扱うのは、ある種のものとして生ポインタを再解釈する」と同じであると考えました。これらの2つのアプローチはどのように異なっていますか?また、今後どのようにこの違いを知ることができますか? –

+0

また、デバッガで 'data'を出力すると、バイト数が0で、ポインタが毎回0x000000000000bad0となります。 –

+0

@BenLeggiero:あなたのコードは' callBackTypeMetaData! 'がポイントします。私のコードは単に 'callBackTypeMetaData! 'の値に' data'を割り当て、残りはコンパイラの型キャストです。ドキュメンテーションでは、未加工のポインタはCFDataオブジェクトであり、CFDataオブジェクトを指しているわけではありません。 –

関連する問題