ios – Swift协议和类的弱引用

如果我有一个协议:

protocol SomeProtocol {
    func doSomething()
}

在辅助类中,我有一个协议变量的引用:

class someClass {
    var delegate: SomeProtocol? 
}

因为SomeProtocol没有标记为:class,所以假设委托可以是任何东西,在值类型(结构和枚举)的情况下,不需要弱变量因为值类型不能创建强引用.事实上,编译器不允许除类类型之外的任何弱变量.

但是,没有什么能阻止您将类设置为委托,并且如果协议未标记为:class(如SomeProtocol所示),则无法使用weak var`并创建保留周期.

class MyClass: NSObject, SomeProtocol {
    func doSomething() { }
}

struct MyStruct: SomeProtocol {
    func doSomething() { }
}

let someClass = SomeClass()
let myStruct = MyStruct()
someClass.delegate = myStruct 
// After myStruct gets assigned to the delegate, do the delegate and the struct refer to the same instance or does the struct get copied?D

let myClass = MyClass()
someClass.delegate = myClass // can't use weak var so myClass is retained

鉴于上面的例子,在使用委托和数据源的情况下,不应该:class总是被使用?基本上任何用于维护引用的协议都应该始终限制为类对象吗?

最佳答案 对.如果你试图用弱引用来破坏保留周期,你必须使用类,因为弱修饰符只适用于引用类型(类).

点赞