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