2015-12-23 1 views
1

Исходящий код, я попытался создать свойство объекта, присваивающего функции функции. И после объекта init я попытался назначить его нолю. Но объект не освобождался (потому что deinit никогда не вызывал).ARC in Swift как разрешить сильный ссылочный цикл при назначении свойства как функции

Я считаю, что проблема является сильным справочным циклом между свойством и объектом владельца. Если на самом деле существует сильный ссылочный цикл, как решить эту проблему при назначении свойства непосредственно с помощью функции?

class MyClass { 
    var aProperty: (() ->())? 

    init() { 
     // problem when assign property as a method 
     self.aProperty = aMethod 
    } 

    func aMethod() { 
     print("method!!!") 
    } 

    deinit { 
     print("MyClass is being deinitialized") 
    } 
} 


var instance: MyClass? = MyClass() 
instance?.aProperty?() 
instance = nil 
+0

Помимо данных ответов: вы должны сделать aProperty частным. – Darko

ответ

0

Вы все еще можете использовать список захвата для предотвращения цикла. Просто заверните вызов метода в закрытие, как показано в приведенном ниже коде.

class MyClass { 
    var aProperty: (() ->())? 

    init() { 
     // use a capture list to prevent a reference cycle 
     self.aProperty = { [unowned self] in self.aMethod() } 
    } 

    func aMethod() { 
     print("method!!!") 
    } 

    deinit { 
     print("MyClass is being deinitialized") 
    } 
} 


var instance: MyClass? = MyClass() 
instance?.aProperty?() 
instance = nil 

Это исключает сильный ссылочный цикл при тестировании.

+0

, этот код действительно установил self.aProperty для закрытия, а не для функции. И функция вызова в закрытии. Я хочу найти ответ о «все равно, чтобы назначить свойство для функции напрямую»? – larva

+0

Как присвоение метода напрямую зависит от функциональности? Функция - это всего лишь тип закрытия в конце концов. –

+0

Я думаю, что я написал путаный вопрос, и я редактировал свой вопрос. Я не думаю, что функция - это просто закрытие. Значение захвата закрытия в контексте и функции не было – larva

1

Вы решаете сильный ссылочный цикл между замыканием и экземпляром класса, определяя список захвата как часть определения закрытия. Список захвата определяет правила, используемые при захвате одного или нескольких ссылочных типов в теле закрытия. Как и в случае сильных ссылочных циклов между двумя экземплярами класса, вы объявляете, что каждая зафиксированная ссылка является слабой или незаслуженной ссылкой, а не сильной ссылкой. Соответствующий выбор слабых или незанятых зависит от отношений между различными частями вашего кода.

lazy var someClosure: Void -> String = { 
[unowned self, weak delegate = self.delegate!] in 
// closure body goes here 

}

из Strong Reference Cycles for Closures

В вашем случае следует применить список захвата при назначении методы к свойству, как этот

init() { 
    self.aProperty = { [unowned self] in self.aMethod() } 
} 
+0

как мой вопрос мы можем использовать список захвата закрытия, чтобы решить эту проблему, когда мы присваиваем свойство закрытию. Но мы не можем использовать список захвата в случае функции – larva

Смежные вопросы