iOS + React Native - утечки памяти - PullRequest
0 голосов
/ 31 мая 2019

Я подумываю о создании iOS-проекта в React Native.В iOS большая проблема найти и исправить так называемые «циклы сохранения», то есть когда два объекта хранят ссылку strong друг на друга:

class Obj1 {
    var delegate: Obj2?
}

class Obj2 {
    var delegate: Obj1?
}


let obj1 = Obj1()
let obj2 = Obj2()

obj1.delegate = obj2
obj2.delegate = obj1

Имеет ли React Native концепциюутечка памяти или сохранение цикла?Будет ли аналогичный код в JS аналоге создавать цикл сохранения в среде React Native?

Как насчет передачи захвата замыкания self?Будет ли это также создавать утечку памяти в React Native?

Сводка:

  1. Не приведет ли приведенный пример кода (переписанный к JS) к утечке памяти в RN?
  2. Может ли захват self в замыкании вызвать утечку памяти?

1 Ответ

0 голосов
/ 31 мая 2019

У вас не должно быть двух объектов, сохраняющих сильные ссылки друг на друга, шаблон делегата обычно обрабатывается наличием одной сильной и одной слабой ссылки, где делегат является слабым.

Теперь на ваши вопросы:

  1. Возможно, но кто-то другой мог бы дать вам лучший ответ, так как я не совсем уверен насчет RN.

  2. Да и нет, в зависимости от того, как вы поступите.

Если вы используете сильное Я, то определенно произойдет утечка памяти:

{ _ in
    self.doSomething()
}

Лучше использовать любое слабое Я:

{ [weak self] _ in
    guard let self = self else { return }
    self.doSomething()
}

или не владеющий собой, если вы можете гарантировать, что «Я» всегда доступен в закрытии:

{ [unowned self] _ in
    self.doSomething()
}
...