How to Correctly handle Weak Self in Swift Blocks with Arguments

ios, retain-cycle, swift

Solution

If self could be nil in the closure use [weak self].

If self will never be nil in the closure use [unowned self].

If it's crashing when you use [unowned self] I would guess that self is nil at some point in that closure, which is why you had to go with [weak self] instead.

I really liked the whole section from the manual on using strong, weak, and unowned in closures:

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html

Note: I used the term closure instead of block which is the newer Swift term:

Difference between block (Objective C) and closure (Swift) in ios

Problem

In my `TextViewTableViewCell`, I have a variable to keep track of a block and a configure method where the block is passed in and assigned. Here is my `TextViewTableViewCell` class: ``` // // TextViewTableViewCell.swift // import UIKit class TextViewTableViewCell: UITableViewCell, UITextViewDelegate { @IBOutlet var textView : UITextView var onTextViewEditClosure : ((text : String) -> Void)? func configure(#text: String?, onTextEdit : ((text : String) -> Void)) { onTextViewEditClosure = onTextEdit textView.delegate = self textView.text = text } // #pragma mark - Text View Delegate func textViewDidEndEditing(textView: UITextView!) { if onTextViewEditClosure { onTextViewEditClosure!(text: textView.text) } } } ``` When I use the configure method in my `cellForRowAtIndexPath` method, how do I properly use weak self in the block that I pass in. Here is what I have without the weak self: ``` let myCell = tableView.dequeueReusableCellWithIdentifier(textViewCellIdenfitier) as TextViewTableViewCell myCell.configure(text: body, onTextEdit: {(text: String) in // THIS SELF NEEDS TO BE WEAK self.body = text }) cell = bodyCell ``` UPDATE: I got the following to work using `[weak self]`: ``` let myCell = tableView.dequeueReusableCellWithIdentifier(textViewCellIdenfitier) as TextViewTableViewCell myCell.configure(text: body, onTextEdit: {[weak self] (text: String) in if let strongSelf = self { strongSelf.body = text } }) cell = myCell ``` When I do `[unowned self]` instead of `[weak self]` and take out the `if` statement, the app crashes. Any ideas on how this should work with `[unowned self]`?

Original source

Related problems