ios запуталась в сильных / слабых ссылках
Я просмотрел вопросы о сильных / слабых ссылках и понял причину использования слабых (отношения между родителями и детьми). Однако меня смущают конкретные сценарии, в которых создаются отношения между родителями и детьми.
Например, добавление вложенных представлений в UIView object..an пример создания отношений между родителями и детьми? А что такое?
До сих пор я делал все в своем проекте, используя сильные, нигде я не использовал слабые, но я не уверен, что я столкнусь с памятью вопросы управления (или как даже проверить, если я буду).
Может ли кто-нибудь привести конкретные ситуации или примеры, в которых создаются отношения между родителями и детьми?
Спасибо!
EDIT: на самом деле, я получаю некоторые "полученные предупреждения памяти" проблемы в одном из моих ViewControllers, который отображает много данных (вид карты, количество изображений, текст, кнопки). Все имущество имеет сильный указатель. Мне нужно исправить мои проблемы с управлением памятью для этого ViewController
3 ответа:
Ваше понимание идет в обратном направлении. Слабые ссылки чаще всего используются для реализации отношений "ребенок-родитель". Они редко имели бы смысл для отношений между родителями и детьми. Как правило, родитель владеет ребенком; это означает сильный.
В подавляющем большинстве случаев вам нужна сильная ссылка. Вот почему это дефолт. Самая распространенная причина не иметь сильной ссылки - это если это вызовет цикл сохранения. Например, если A имеет сильную ссылку на B, то если B имел сильная ссылка на A будет иметь петлю, и ни один объект никогда не будет освобожден. Таким образом, вы выбираете один из объектов, чтобы быть владельцем, и он имеет сильную ссылку. Другой объект имеет слабую ссылку.
Наиболее распространенным случаем этого является делегирование полномочий. Делегат почти всегда владеет тем, для чего он делегирован. Таким образом, делегирующий объект должен иметь слабую ссылку на делегата. В качестве соглашения в Objective-C ожидается, что свойствоdelegate
будет слабым. (Если это чувствует в обратном порядке подумайте о том, как вы используетеUITableView
иUITableViewDelegate
на практике, и какой из них вы хотели бы считать "владельцем".")Слабые указатели делегатов не являются жестким и быстрым правилом. Есть исключения, такие как
NSURLConnection
. Если срок жизни делегирующего объекта короче, чем у делегата, то для него нормально (и вообще предпочтительно) поддерживать сильную ссылку."полученное предупреждение памяти" не обязательно имеет какое-либо отношение к управлению памятью. Это просто означает, что Вы тоже используете столько памяти. Если у вас есть петли сохранения, то у вас может быть утечка памяти, и это вызовет это предупреждение. Но это также может быть потому, что вы просто используете слишком много памяти. Инструмент "распределения" в инструментах-лучший способ исследовать это.
Хотя реализация "сильных" и "слабых" является очень недавним дополнением к Objective-C, они просто формализуют и обеспечивают лучшую языковую поддержку того, что правильно написанный код делал в течение многих лет с ручным сохранением. То модели владения сегодня идентичны тем, что были до ARC.
Некоторые люди собрали очень полезную диаграмму, объясняющую, когда следует использовать слабые ссылки на класс Piazza" кодирование вместе". В нем есть несколько замечательных диаграмм, объясняющих базовое управление памятью с помощью сильных / слабых указателей.
Когда вы добавляете подвид к виду, родитель сохранит его подвидом под обложкой. Да, это отношения между родителями и детьми. Если вы создаете свои собственные подклассы UIView, вы будете делать то же самое.
Родители имеют сильные отношения со своими детьми, но дети никогда не должны иметь сильных отношений со своими родителями. Это может привести к сохранению циклов, где ни один из них не может быть освобожден, потому что они оба имеют сильную связь друг с другом.Сильный-это по умолчанию, вы будете склонны использовать слабый, когда вы используете шаблон делегата.
Возможно, вам следует опубликовать более конкретную информацию о проблеме, с которой вы столкнулись с полученным предупреждением памяти, так как этот вопрос довольно общий о семантике памяти.