La faiblesse de l'autonomie dans les fermetures et les conséquences exemple

J'ai fait abit de la recherche sur stackoverflow et la documentation d'apple à propos de l'ARC et de la Faiblesse/Propriétaire de l'auto (Doit-on toujours utiliser [propriétaire d'auto] à l'intérieur fermeture à Swift). Je reçois l'idée de base au sujet de la solidité de cycle de référence et comment il n'est pas bon car ils provoquent des fuites de mémoire. Cependant, je suis en train d'essayer d'obtenir ma tête autour de quand utiliser Faibles/Propriétaire de l'auto dans les fermetures. Plutôt que d'aller dans la "théorie", je pense qu'il serait vraiment vraiment aider si quelqu'un pouvait m'expliquer en termes de bas de trois cas que j'ai. Ma questions est

  1. Est-il correct de mettre la faiblesse de l'autonomie dans chacun d'eux (je pense que pour le cas de deux il n'est pas nécessaire parce que j'ai vu quelque part que UIView n'est pas associée à soi-même?. Cependant, ce que si je mets de la faiblesse de l'autonomie de là, il n'y a rien qui peut me causer des maux de tête?

  2. Dire si la réponse est Non, vous ne pouvez pas mettre la faiblesse de soi partout, dans tous les trois cas, qu'adviendrait-il si je n' (exemple de réponse serait très appréciée...Par exemple, le programme crash lors de ce CR ....

  3. C'est de cette façon j'ai l'intention d'utiliser weakSelf
    En dehors de la fermeture, j'ai mis de la faiblesse de la var weakSelf = auto
    Ensuite, remplacer tous les auto fermeture avec weakSelf?
    Est-ce que ça à faire?

    Case 1:
    FIRAuth.auth()?.signInWithCredential(credential, completion: {    (user: FIRUser?, error: NSError?) in
    self.activityIndicatorEnd()
    self.performSegueWithIdentifier(SEGUE_DISCOVER_VC, sender: self)
    })
    Case 2:
    UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.1, animations: {
    self.messageLbl.alpha = 0.5
    })
    Case 3: 
    //checkUserLoggedIn sends a request to firebase and waits for a response to see if the user is still authorised
    checkUserLoggedIn { (success) in
    if success == false {
    //We should go back to login VC automatically
    
    } else {        
    self.discoverTableView.delegate = self
    self.discoverTableView.dataSource = self
    //Create dropdown menu
            let menuView = BTNavigationDropdownMenu(navigationController: self.navigationController, title: self.dropDownItems.first!, items: self.dropDownItems)
    menuView.didSelectItemAtIndexHandler = {[weak self] (indexPath: Int) -> () in
    if indexPath == 0 {
    self?.mode = .Closest
    self?.sortByDistance()
    } else if indexPath == 1 {
    self?.mode = .Popular
    self?.sortByPopularity()
    } else if indexPath == 2 {
    self?.mode = .MyPosts
    self?.loadMyPosts()
    } else {
    print("Shouldnt get here saoihasiof")
    }
    }
    //Xib
            let nib = UINib(nibName: "TableSectionHeader", bundle: nil)
    self.xibRef = nib.instantiateWithOwner(self, options: nil)[0] as? TableSectionHeader
    self.discoverTableView.registerNib(nib, forHeaderFooterViewReuseIdentifier: "TableSectionHeader")
    //Set location Manager data
            self.locationManager.delegate = self
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
    //Check location service status
            if self.locationAuthStatus == CLAuthorizationStatus.AuthorizedWhenInUse {
    //Already authorised
                self.displayMessage.hidden = false
    } else if self.locationAuthStatus == CLAuthorizationStatus.NotDetermined {
    //Have not asked for location service before
                let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewControllerWithIdentifier("LocationVC") as! LocationVC
    vc.locationVCDelegate = self
    self.presentViewController(vc, animated: true, completion: nil)
    } else {
    let alertController = UIAlertController(title: "Enable Location", message: "location is required to load nearby posts", preferredStyle: .Alert)
    let cancelAction = UIAlertAction(title: "Cancel", style: .Default, handler: nil)
    let settingsAction = UIAlertAction(title: "Settings", style: .Default, handler: { (action: UIAlertAction) in
    let settingsUrl = NSURL(string: UIApplicationOpenSettingsURLString)
    if let url = settingsUrl {
    UIApplication.sharedApplication().openURL(url)
    }
    })
    alertController.addAction(settingsAction)
    alertController.addAction(cancelAction)
    self.presentViewController(alertController, animated: true, completion: nil)
    self.displayMessage.hidden = false
    self.displayMessage.text = "Could not determine your location to find nearby posts. Please enable location Service from settings"
    }
    //Styling
            self.refreshBtn.tintColor = COLOR_NAVIGATION_BUTTONS
    self.discoverTableView.backgroundColor = COLOR_DISCOVERVC_TABLEVIEW_BACKGROUND
    //Allow navigation bar to hide when scrolling down
            self.hidingNavBarManager = HidingNavigationBarManager(viewController: self, scrollView: self.discoverTableView)
    //Allow location to start updating as soon as we have permission
            self.locationManager.startUpdatingLocation()
    }
    }

--Update--
La plupart de mon code ressemble cas 3 où tout est enveloppé à l'intérieur d'une fermeture qui soit de vérifier si il existe une connectivité internet avant tout de l'action s'est déroulée. J'ai la faiblesse de l'auto partout??

--Mise à jour 2--

Case 4: 
//The haveInternetConnectivity function checks to see if we can reach google within 20 seconds and return true if we can 
haveInternetConnectivity { (success) in
if success == false {
self.dismissViewControllerAnimated()
} else {        
self.label.text = "You are logged in" 
self.performSegueWithIdentifier("GoToNextVC")
}
}

Question à propos de l'affaire 4.
Ai-je raison de dire que, même si cette fermeture n'a pas de faiblesse ou propriétaire de l'auto, il ne sera jamais à créer une forte référence (et la fuite de mémoire) car même si le VC est licencié avant la fin de bloc est exécuté, Xcode va tenter d'exécuter le code à l'intérieur de l'achèvement de bloc lorsque nous avons confirmé l'état de l'internet et ne rien faire (Pas de plantage) parce que le moi n'existe plus. Et une fois que le code a atteint la dernière ligne à l'intérieur de la clôture, la référence forte à l'autonomie serait détruit donc de libérer le VC?

Afin de mettre [faible Auto] dans ce cas serait juste de dire que xcode ne tiendrait pas compte de ces lignes (que s'opposer à l'essayer et de le lancer et il ne se passe rien), qui serait synonyme d'une meilleure pratique, mais pas de questions sur ma main de toute façon

OriginalL'auteur user172902 | 2016-08-21