2017-12-28 2 views
0

JSONに関するフレームワークを学ぼうとしています。フレームワーク名はHandyJSONです。私はPointerについていくつか問題があります。UnsafePointとSwiftオブジェクトのルールは何ですか?ここにいくつかのコードがあります

私はクラスプロパティが構造体に表示されることがわかりますが、それは正しいですか?

"func class_rw_t()"はどういう意味ですか?

なぜ "databits_t & fast_data_maskは" "_class_rw_t" を指すことができますか?そしてなぜ "fast_data_mask"が "0x00007ffffffffff8"ですか?

コード:

struct _class { 
var kind: Int 
var superclass: Any.Type? 
var reserveword1: Int 
var reserveword2: Int 
var databits: UInt 
// other fields we don't care 

func class_rw_t() -> UnsafePointer<_class_rw_t>? { 
    if MemoryLayout<Int>.size == MemoryLayout<Int64>.size { 
     let fast_data_mask: UInt64 = 0x00007ffffffffff8 
     let databits_t: UInt64 = UInt64(self.databits) 
     return UnsafePointer<_class_rw_t>(bitPattern: UInt(databits_t & fast_data_mask)) 
    } else { 
     return UnsafePointer<_class_rw_t>(bitPattern: self.databits & 0xfffffffc) 
    } 
}} 

struct _class_rw_t { 
var flags: Int32 
var version: Int32 
var ro: UInt 

func class_ro_t() -> UnsafePointer<_class_ro_t>? { 
    return UnsafePointer<_class_ro_t>(bitPattern: self.ro) 
}} 

struct _class_ro_t { 
var flags: Int32 
var instanceStart: Int32 
var instanceSize: Int32} 


class TestModel {} 

let c = TestModel() 
let pointer = unsafeBitCast(TestModel.self, to: UnsafePointer<_class>.self) 
let instanceStart = pointer.pointee.class_rw_t()?.pointee.class_ro_t()?.pointee.instanceStart 

答えて

0

あなたが貼り付けられたコードは、Objective-Cランタイムの内部の詳細にアクセスします。それは非常に高度で非常に壊れやすいです。もし私があなただったら、私はこの図書館から遠く離れたところにいます。

_class_rw_tタイプはclass_rw_t構造体にアクセスするためのもので、objc-runtime-new.hで定義されています。また、そのファイル内に定義されているFAST_DATA_MASKの使用を見ることができます。 Objective-Cランタイムソースコードを理解するには、C++を知る必要があります。

+0

ありがとう、objc-runtime-new.hが私に必要なものです。 – Eggplant

関連する問題