Если у меня есть протокол:Swift ссылки протокола и слабый с классом
protocol SomeProtocol {
func doSomething()
}
и в вспомогательном классе, у меня есть ссылка на переменный протокол:
class someClass {
var delegate: SomeProtocol?
}
потому 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
Приведенный выше пример, в случае использования делегатов и источника данных, не должен использоваться всегда : class
? В принципе, любой протокол, который используется для ведения ссылки, должен всегда ограничиваться объектами класса?
Я считаю, что только класс делегата/структура имеет слабую ссылку на делегата, а не на делегата, имеющего слабую ссылку на делегата. – tktsubota
Я тоже так думал, но я узнал, когда создавал вспомогательный класс 'UICollectionView' со ссылкой на протокол, который не был помечен классом, где ссылка была на' UIViewController'. Поскольку протокол не был классом, свойство не могло быть «слабым» и никогда не было освобождено. – barndog
Типы значений могут создавать сильные ссылки. Вы просто не можете создать слабую ссылку на типы значений. –