「已注销」 2023-06-14 23:17 采纳率: 0%
浏览 32

自学swift想到一个遇循环引用问题

自学swift,想到一个循环引用的问题,如果创建一个结构体,和一个类,相互引用着对方,如下:

struct StructObj {
    var classObj: ClassObj?
}

class ClassObj {
    var structObj: StructObj?
    deinit {print("ClassObj deinit")}
}

func test() {
    print("start")
    
    var structObj: StructObj? = StructObj.init() //Struct
    var classObj: ClassObj? = ClassObj.init()    //Class
    
    // structObj不释放
    structObj!.classObj = classObj
    classObj!.structObj = structObj
//-----------------
    // classObj会释放
//    classObj!.structObj = structObj
//    structObj!.classObj = classObj
    
    print("end")
}

test()

在运行这2句代码时

    struct Obj!.classObj = classObj
    classObj!.structObj = structObj

相互引用着,导致类classObj无法释放,但是如果这2句代码交换位置:

    classObj!.structObj = structObj    
    struct Obj!.classObj = classObj

此时能释放classObj
分析不出这其中的原因,请达老帮忙解答一下!

  • 写回答

1条回答 默认 最新

  • threenewbee 2023-06-16 14:54
    关注

    可以使用弱引用或无主引用

    class ClassObj {
        weak var structObj: StructObj?
        deinit { print("ClassObj deinit") }
    }
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 6月14日