2017-12-28 34 views
0

JSON에 대한 프레임 워크를 배우려고합니다. 프레임 워크 이름은 입니다. HandyJSON입니다. 포인터에 대한 몇 가지 문제점이 있습니다.UnsafePoint 및 Swift Object에 대한 규칙은 무엇입니까? 여기에 몇 가지 코드가 있습니다

클래스 속성이 구조체에 표시 될 수 있다는 것을 알고 있습니다. 맞습니까?

"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