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

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

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

最佳答案

假设 FKMasterViewController 保留其项目,是的,存在保留周期。

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

关于快速传递类方法作为参数与闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31705542/

相关文章:

iOS - 从 UITableView 崩溃中删除行

ruby - 单个数组参数与多个参数

ios - 打印对象的强所有者,Swift

c - Linux内核编码风格

ios - 在一个 block 中保留循环

objective-c - block , self ,保留循环

swift - 不使用 AWSLexVoiceButton 向 Lex 发送音频(适用于 iOS 的 AWS sdk)

ios - 使用场景停靠栏的 View 不会在水平 ScrollView 中复制自身

ios - 设备旋转动画在 iOS 10 中不起作用

实例变量上的Java调用方法