У меня есть класс Swift, который должен хранить таблицу собственных методов. К сожалению, это вызывает опорный цикл, потому что его таблица сохраняет ссылки на self
с помощью методов, которые он хранит.
Пример кода утечки ниже:
typealias Callback = ()->()
class CycleInducingClass : NSObject {
var myCallbacks = [Callback]()
override init() {
super.init()
myCallbacks.append(myInternalFunction)
}
func myInternalFunction() {
NSLog("lolol: %d", self.myCallbacks.count)
}
}
Единственное решение, которое я нашел до сих пор, заключается в том, чтобы сделать это:
myCallbacks.append({[unowned self] in self.myInternalFunction()})
Это довольно уродливо и подвержено ошибкам. Любые лучшие идеи? Есть ли какой-то трюк для того, чтобы сами ссылки на функции были слабыми? т.е. создать массив myCallbacks
типа myCallbacks : [WeakCallback]()
или что-то еще? Насколько я могу судить, я даже не могу создать удобную функцию weaken
в качестве синтаксического сахара над уродливой закрывающей упаковкой выше.