Как выглядят слабые и сильные ссылки в target-c? - PullRequest
14 голосов
/ 05 сентября 2011

Википедия заявляет: «В компьютерном программировании слабая ссылка - это ссылка, которая не защищает ссылочный объект от сбора сборщиком мусора».Как эти два типа ссылок выглядят в коде?Является ли слабая ссылка ссылкой, сделанной автоматически выпущенным сообщением?

Ответы [ 2 ]

16 голосов
/ 05 сентября 2011

Следующий ответ для случая, когда нет сборки мусора (например, на iOS).В случае сборки мусора, на самом деле есть ключевое слово (__weak) для создания слабой ссылки.

«Слабая» ссылка - это ссылка, которую вы не сохраняете.

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

Является ли слабая ссылка ссылкой на автоматически выпущенное сообщение?

Не совсем, это будет "очень слабая ссылка"; -)

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

6 голосов
/ 05 сентября 2011

Слабая ссылка - это ссылка, которая недостаточно сильна, чтобы заставить объект оставаться в памяти, в то время как сильная ссылка заставляет объект оставаться в памяти.

Если вы создали слабую ссылку на какую-либо переменную, вы можете получить ноль за это.

UITableViewDelegate, UIScrollViewDelegate и т. Д. Являются примерами слабых ссылок.

Пример строгой ссылки:

MyClass *obj1 = [[Myclass alloc] init];

Myclass *obj2 = obj1;

Здесь obj2 имеет прямую ссылку на obj1 означает, что если вы удалите obj2 из памяти, тогда obj1 также будет удален.

...