Swift不支持扩展中的存储属性。解决这个问题的方法是按照建议here使用objc_setAssociatedObject
。我要做的是创建一个存储属性,这是一个归零的弱引用。请注意,使用OBJC_ASSOCIATION_ASSIGN
是不够的,因为在取消分配对象时它不会将引用归零。
我需要等同于
的东西extension MyClass {
weak var myVar: NSObject?
}
答案 0 :(得分:0)
我探讨了使用obj_storeWeak
和objc_loadWeak
但最终只使用了包装类:
internal class WeakWrapper : NSObject {
weak var weakObject : NSObject?
init(_ weakObject: NSObject?) {
weakObject = weakObject
}
}
extension MyClass {
var myVar: NSObject? {
get {
var weakWrapper: WeakWrapper? = objc_getAssociatedObject(self, &associationKey) as? WeakWrapper
return weakWrapper?.weakObject
}
set {
var weakWrapper: WeakWrapper? = objc_getAssociatedObject(self, &associationKey) as? WeakWrapper
if weakWrapper == nil {
weakWrapper = WeakWrapper(newValue)
objc_setAssociatedObject(self, &associationKey, weakWrapper, UInt(OBJC_ASSOCIATION_RETAIN))
} else {
weakWrapper!.weakObject = newValue
}
}
}
}