HandyJSON中提到HandyJSON目前依赖于从Swift Runtime源码中推断内存规则。本文旨在根据https://www.cnblogs.com/taoxu/p/7975984.html 做一个学习笔记。

测试代码:

class TestASwiftClass {

    var aBoll = true
    var aInt = 0
    
    func testReturnVoidWithaId(aId: UIView) {
        print("TestASwiftClass.testReturnVoidWithaId")
    }
    
}
class ViewController: UIViewController {

    let testStringOne = "testStringOne"
    let testStringTwo = "testStringTwo"
    let testStringThr = "testStringThr"
    var count:UInt32 = 0
 
    override func viewDidLoad() {
        super.viewDidLoad()
 
        let SwiftClass = TestASwiftClass()
        if let proList = class_copyPropertyList(object_getClass(SwiftClass),&count) {
            for i in 0..<numericCast(count) {
                let property = property_getName(proList[i]);
                print("属性成员属性:%@",String.init(utf8String: property) ?? "没有找到你要的属性");
            }
        }
    }
    
}

如果能通过Runtime获取swift中的属性方法,上面的代码会打印TestASwiftClass中的属性。但是运行后发现没有打印。如果我们将let proList = class_copyPropertyList(object_getClass(SwiftClass),&count)改成let proList = class_copyPropertyList(object_getClass(self),&count),也就是获取ViewController中的属性。我们发现运行后能勾获取对应属性。
image

可以看到调用OC中的类确实能够使用Runtime,但是swift不行。那么问题来了,swift就不能使用Runtime了吗?

class TestASwiftClass {
    @objc dynamic var aBoll = true
    var aInt = 0
    dynamic func testReturnVoidWithaId(aId: UIView) {         
        print("TestASwiftClass.testReturnVoidWithaId")
    }
}

我修改了代码,将属性和方法加入关键字@objc和dynamic,然后在测试代码。这一次成功能获取到属性变量aBoll。现阶段的swift中使用Runtime大体是这样,借用OC去实现,但我看swift官方也有在开发原生swift对于Runtime的实现https://github.com/apple/swift/blob/master/docs/Runtime.md