ios - 如何正确处理带有参数的 Swift block 中的 Weak Self

标签 ios swift retain-cycle

在我的 TextViewTableViewCell 中,我有一个用于跟踪 block 的变量和一个用于传入和分配 block 的配置方法。
这是我的 TextViewTableViewCell 类:

//
//  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)
        }
    }
}

当我在 cellForRowAtIndexPath 方法中使用 configure 方法时,如何在传入的 block 中正确使用 weak self。
这是没有弱 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

更新:我使用[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

当我执行 [unowned self] 而不是 [weak self] 并取出 if 语句时,应用程序崩溃了。关于如何使用 [unowned self] 有什么想法吗?

最佳答案

如果 self 在闭包中可以为 nil,则使用 [weak self]

如果 self 在闭包中永远不会为 nil,则使用 [unowned self]

如果它在你使用 [unowned self] 时崩溃,我猜 self 在那个闭包的某个时刻是 nil,这就是为什么你必须使用 [weak self] 代替。

我真的很喜欢手册中关于在闭包中使用strongweakunowned 的整个部分:

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

注意:我使用的术语是 closure 而不是 block 这是较新的 Swift 术语:

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

关于ios - 如何正确处理带有参数的 Swift block 中的 Weak Self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24468336/

相关文章:

ios - 使用 CameraUI 拍摄照片和视频 : MediaPromise. 文件在 iOS 上为空

swift - 如果您有一个 firebase 快照,其中过滤器应用于当前用户的 child ,那么如何对数据库中的所有用户执行此操作?

ios - 从 Facebook 获取个人资料图片太慢

objective-c - 在 block 内使用 self 的方法

ios - AFNetworking 的保留周期

iphone - 倒计时应用程序给出预期的 "]"错误

ios - 具有灵活宽度的 UICollectionViewCell

swift - 核心数据和关系谓词

IOS block 不保留 self ?

iphone - MFI结束了吗?通往Arduino和其他设备的电缆