Имеют ли переменные в функциях сильные ссылки на свои объекты, или они могут быть освобождены во время выполнения тела функции? - PullRequest
2 голосов
/ 06 марта 2020

Я предполагаю, что ответ - нет, но мне трудно найти прямой ответ. Например:

func doSomething() {
  let thing = Things.sharedInstance.list[0]

  if let maybeProperty = thing.property { // Program Crashes EXC bad memory access error
    // Do something with property
  }
}

Является ли list как свойство класса единственной надежной ссылкой, в то время как thing внутри функции (в классе) не содержит сильную ссылку / не увеличивает счетчик ссылок? Следовательно, в состоянии гонки между назначением и необязательным назначением для разворачивания переменной базовый thing может быть освобожден?

Спасибо! :)

1 Ответ

1 голос
/ 06 марта 2020

Имеют ли переменные в функциях сильные ссылки на свои объекты?

Да, thing сохранит сильную ссылку на Things.sharedInstance.list[0]

Может они будут освобождены во время выполнения тела функции?

Это зависит от контекста.

  • Если ваш код работает на один последовательный поток объект, на который указывает thing, никогда не будет освобожден в середине выполнения функции.
  • Если ваш код выполняется на нескольких потоках или одновременно , это может произойти (я полагаю, это ваш случай )

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

CURRENT THREAD    |      OTHER THREAD
-------------------------------------
                  | Remove or replace
                  | list[0] (called
                  | object)
                  |
Load pointer to   |
object            |
                  |
                  | Reduce reference
                  | count of object
                  |
                  | Free object
                  |
Increase reference|
count of object   |
(!)               |
                  |
Access property   |
from object (!)   |
                  |

Здесь может произойти множество проблем, но обычно вы получите крат sh согласно документу Apple для Automati c Подсчет ссылок

Если AR C должен был освободить экземпляр, который все еще использовался, было бы больше невозможно получить доступ к свойствам этого экземпляра или вызвать методы этого экземпляра. Действительно, если бы вы попытались получить доступ к экземпляру, ваше приложение, скорее всего, взломало бы sh.

...