Обновление:. Это исправлено в 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(), авария исчезнет. Это действительно озадачивает, потому что назначение выражения переменной и последующее назначение переменной и назначение выражения напрямую должны вести себя одинаково.