作为参数与闭包的Swift传递类方法

时间:2015-07-29 15:59:49

标签: swift coding-style retain-cycle

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

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

我的问题是,在这种情况下是否会有保留周期,或者当itemCallback上的非可选属性MasterItem设置为nil {{1}时,应用会崩溃得到解除引用。这可能是相关的原因是因为函数MasterDetail在理论上可以用作类方法而不仅仅是一个闭包属性。

1 个答案:

答案 0 :(得分:1)

假设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) }