Имеют ли переменные в функциях сильные ссылки на свои объекты?
Да, 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.