Swift 协议和类的弱引用

bar*_*dog 5 ios swift

如果我有一个协议:

protocol SomeProtocol {
    func doSomething()
}
Run Code Online (Sandbox Code Playgroud)

在辅助类中,我引用了协议变量:

class someClass {
    var delegate: SomeProtocol? 
}
Run Code Online (Sandbox Code Playgroud)

因为SomeProtocol没有标记为: class,所以假设可以delegate是任何东西,并且在值类型(结构和枚举)的情况下不需要,weak var因为值类型无法创建强引用。weak var事实上,编译器除了类类型之外不允许任何类型。

但是,没有什么可以阻止您将类设置为委托,并且如果协议未标记为: class(因为SomeProtocol is),无法使用弱 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
Run Code Online (Sandbox Code Playgroud)

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

Val*_*gin 1

正确的。如果您尝试使用弱引用打破保留周期,则必须使用类,因为weak修饰符仅适用于引用类型(类)。

  • 不,你不能,只是因为保留循环不会调用 `deinit` 方法。 (4认同)