快速传递类方法作为参数vs闭包



我有一个关于给定情况下潜在保留周期的问题。

public struct MasterItem {
    public let itemTitle: String!
    public var itemImage: UIImage?
    public let itemCallback: ((MasterItem) -> Void)!
    public let ord: Int!
    public init(itemTitle: String, itemImage: UIImage?, ord: Int = Int.min, itemCallback: (MasterItem) -> Void) {
        self.itemTitle = itemTitle
        self.itemImage = itemImage
        self.itemCallback = itemCallback
        self.ord = ord
    }
}
class MasterDetail: FKMasterDetailViewController {
    let master = FKMasterViewController(items: [])
    override func viewDidLoad() {
        let arr: [MasterItem] = [
            MasterItem(itemTitle: "Bob",  itemImage: UIImage(), ord: 1, itemCallback: self.menuItemTapped),
            MasterItem(itemTitle: "Fred", itemImage: UIImage(), ord: 2, itemCallback: self.menuItemTapped),
            MasterItem(itemTitle: "Jedd", itemImage: UIImage(), ord: 3, itemCallback: self.menuItemTapped)
        ]
        for item in arr { self.master.addMasterItem(item) }
    }
    func menuItemTapped(item: MasterItem) {
        //reference self in here
    }
}

我的问题是,在这种情况下会有一个保留周期,或者当MasterItem上的非可选属性itemCallback被设置为nil时,如果MasterDetail被取消引用,应用程序会崩溃吗?这可能是相关的原因是因为从理论上讲,函数menuItemTapped作为一个类方法可能有用,而不仅仅是一个闭包属性。

假设FKMasterViewController保持着items,是的,存在保留周期。

self.menuItemTapped只是

的语法糖
{ x in self.menuItemTapped(x) }

如果你知道FKMasterViewController及其items和回调只存在于FKMasterDetailViewController的上下文中,那么闭包应该捕获对FKMasterDetailViewController的弱引用:

{ [unowned self] x in self.menuItemTapped(x) }

{ [weak self] x in self?.menuItemTapped(x) }

最新更新