Обновление:. Это исправлено в Xcode 6 beta 6.
Следующий код вызывает EXC_BAD_ACCESS в строке delegate?.thing()
:
@class_protocol protocol Fooable {
func foo()
}
class Bar : Fooable {
func foo() {
}
}
weak var delegate: Fooable?
let bar = Bar()
delegate = bar
delegate?.foo()
Но все кажется мне правильным. Для того чтобы переменная была weak
, она должна иметь необязательный тип. Таким образом, переменная delegate
является необязательной. Слабый тип переменной также должен быть типом класса, поэтому я сделал протокол протоколом класса. Поскольку я использую необязательную цепочку, я ожидаю, что она будет 1) быть nil
и ничего не делать, или 2) не быть nil
, и вызвать метод, который должен быть успешным. Однако он сбой.
Может ли быть, что необязательная цепочка не является атомарной и не сохраняет выражение, и объект каким-то образом освобождается между проверкой на nil
и последующим вызовом?
Интересно, что если вы исключите переменную bar
и назначьте ее непосредственно как delegate = Bar()
, авария исчезнет. Это действительно озадачивает, потому что назначение выражения переменной и последующее назначение переменной и назначение выражения напрямую должны вести себя одинаково.