我有一个关于特定情况下潜在保留周期的问题。
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
在理论上可以用作类方法而不仅仅是一个闭包属性。
答案 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) }