Desbordamiento de stack causado por llamar a un cierre rápido en otro cierre

ACTUALIZACIÓN: este error es confirmado por rdar: // 20931915 y se fija en Xcode 7 beta 3.


Encontré un error extraño causado al llamar a un cierre rápido en otro cierre en la compilation de debugging. Mi Xcode es la versión 6.3.1 con Swift versión 1.2. Aquí está el código:

import Swift class ClosureStackOverflow { private var b: Bool = false private func callClosure1(callback: Void -> Void) { println("in closure 1") callback() } private func callClosure2(callback: Void -> Void) { println("in closure 2") callback() } func call() { callClosure1 { [weak self] in self?.callClosure2 { self?.b = true } } } } let c = ClosureStackOverflow() c.call() 

El código de arriba se comstack bien. Sin embargo, si llama a su método de llamada (), imprimirá "en cierre 2" infinitamente y eventualmente desbordará la stack.

¿Podría explicar por qué llamar a un cierre dentro de otro causará este error?

Gracias.

    Cambia tu código a esto y funcionará

      class ClosureStackOverflow { private var b: Bool = false private func callClosure1(callback: Void -> Void) { println("in closure 1") callback() } private func callClosure2(callback: Void -> Void) { println("in closure 2") callback() } func call() { callClosure1 { self.callClosure2 { self.b = true } } } deinit{ print("deinit") } } 

    Parece que declara [weak self] in en la function y causa el problema.

    También pruebo esto para llamar

      let c = ClosureStackOverflow() c.call() 

    Saldrá a la venta

      in closure 1 in closure 2 deinit 

    Parece que no causa references circulares si no usas el yo débil

    Además , también ensayo para cambiar la function a este

      func call() { callClosure1 { [weak self] in self!.callClosure2 { self?.b = true } } } 

    También funcionará. Entonces, creo que esto puede ser un error de comstackdor de Swift.