我有一个关于给定情况下潜在的保留周期的问题。
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/