Pourquoi l'autonomie est libéré lors de l'appel [propriétaire de soi]

Je suis en train d'écrire une simple clôture en tant que gestionnaire d'achèvement, et à l'intérieur de la fermeture de définir la valeur de texte d'une zone de texte:

class ViewController: UIViewController {

    @IBOutlet var textArea : UITextView

    let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration()

    let session:NSURLSession?


    init(coder aDecoder: NSCoder!)  {
        super.init(coder: aDecoder)

        session = NSURLSession(configuration: sessionConfig)
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        //Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func btnSendRequestTapped(sender : AnyObject) {

        let url:NSURL  = NSURL(string: "https://www.google.com")

        let sessionTask:NSURLSessionTask =
        session!.dataTaskWithURL(url, completionHandler: {
            [unowned self]
            (data:NSData!,response:NSURLResponse!,error:NSError!) -> Void in
            let st:String = NSString(data: data,encoding: NSUTF8StringEncoding)

            println("\(st)")

            NSOperationQueue.mainQueue().addOperationWithBlock({
                () -> Void in
                self.textArea!.text = st
                })
            })

        sessionTask.resume()
    }
}

mais sur la ligne où j'ai défini [propriétaire d'auto], je suis EXC_BREAKPOINT(code=EXC_I386_BPT,subcode=0x0), et c'est en montrant un peu de code assembleur comme suit:

libswift_stdlib_core.dylib`_swift_abortRetainUnowned:
0x1001bb980:  pushq  %rbp
0x1001bb981:  movq   %rsp, %rbp
0x1001bb984:  leaq   0x176a7(%rip), %rax       ; "attempted to retain deallocated object"
0x1001bb98b:  movq   %rax, 0x792ce(%rip)       ; gCRAnnotations + 8
0x1001bb992:  int3   
0x1001bb993:  nopw   %cs:(%rax,%rax)

Je ne suis pas sûr de ce que j'ai fait de mal ici, basée sur la documentation. J'ai mis à jour la question contient l'ensemble de la classe.
Aussi j'ai mis à jour la question de mettre à jour la propriété text de TextView sur le thread principal

  • C'est exactement ce que le [unowned self] est pour.
  • reportez-vous ici developer.apple.com/library/prerelease/ios/documentation/swift/...
  • Votre objet est libéré avant la completionHandler est invoquée. Vous avez besoin de garder une référence à quelque part.
  • pouvez-vous nous donner plus de contexte pour ce self est?
  • l'auto est une instance de UIViewController et ce code est à l'intérieur de ibaction d'un bouton, appuyez sur
  • d'accord, mais pourquoi? selon la documentation d'apple sur la Résolution Forte des Cycles de Référence pour des Fermetures, il ne devrait pas (corrigez-moi si je me trompe)
  • J'ai récemment discuté d'un problème semblable, stackoverflow.com/questions/24137090/... Il semble y avoir quelques bug dans le cadre de parce que le contrôleur peut apparemment être libéré alors qu'il y a toujours des références (par exemple, quand ils sont encore sur l'écran).
  • BTW, vous n'avez pas besoin [unowned self] ici, car il n'y a pas de conserver cycle de toute façon - le contrôleur ne conserve pas la fermeture.
  • vous avez raison, mais j'ai changé d'fermeture à être un [@]paresseux propriété de UIViewController classe et l'a transmis à dataTaskWithURL comme completionHandler paramètre, toujours la même question, comme vous l'avez mentionné, je crois que c'est un bug dans le cadre
  • La même erreur dans l'une des circonstances différentes (je l'ai fait volontairement un cycle de conserver seulement pour des fins de test ) ... Il y a une réponse qui explique en partie le problème (je dis en partie, car il n'y a pas d'explication détaillée de ce qui se passe sous le capot et pourquoi il est aléatoire etc) Encore, il peut vous donner une idée de ce qui se passe.

InformationsquelleAutor CjCoax | 2014-06-12