Подтвердить что ты не робот

Когда следует использовать Strong vs Weak для IBOutlets (дальнейшее разъяснение)

Мне казалось, что я ясно это понял из этого вопроса → Должны ли IBOutlets быть сильными или слабыми при ARC?, но я недавно имел дискуссию, которая оставила меня в полном замешательстве. Может ли кто-нибудь подтвердить, правильно ли следующее? (если это дубликат, я не хотел нарушать какие-либо правила.. просто нужно уточнить, как лучше понять диаграммы, чем слова..)

enter image description here

В ARC (MacOSx)

  • view1 = strong
  • MainView = слабый (в WindowControllerA)
  • MainView = сильный (в ViewControllerB)
  • view2 = strong
  • view3 = слабый (в ViewcontrollerB)
  • view3 = strong (В ViewControllerC)

Если это правильно, то кто-то может подтвердить, пожалуйста.

В приведенной выше диаграмме у нас есть windowControllerA, который на экране. В окне windowControllerA есть 2 NSView. view1 принадлежит windowController, но mainView относится к представлению instianciated viewController, ViewControllerB.

ViewControllerB также содержит 2 вида в своем mainView. View2 принадлежит viewControllerB, а view3 принадлежит другому экземпляру viewController, ViewControllerC.

ViewController C имеет одно представление, которому оно принадлежит.

4b9b3361

Ответ 1

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

В дни, предшествовавшие ARC, некоторые люди были счастливы полагаться на иерархию представлений, чтобы сохранить их представления для них, и поэтому устанавливают их свойства выпуска на assign. Другим не понравилась идея о том, что икота в иерархии представлений может оставить их с несколькими оборванными указателями и поэтому установить их свойства на retain. ARC дает нам обнуление слабых ссылок, так что ваши выходы будут установлены в nil, если объекты, на которые они указывают, будут освобождены, и что использование слабых ссылок для торговых точек кажется намного более безопасным. С другой стороны, если вы хотите сохранить ссылку на представление, даже если иерархия представления, содержащая это, будет освобождена, вы должны установить эту ссылку на strong.

Поскольку ваш контроллер представления отвечает за иерархию представления, которую он управляет (т.е. "владеет" ), он должен иметь сильную ссылку на представление верхнего уровня. Вам не нужно слишком беспокоиться об этом, так как свойство view любого контроллера представления UIViewController имеет значение retain (т.е. strong).

Ответ 2

До тех пор, пока я понял это: "Все объекты верхнего уровня должны быть сильными, а subviews должны быть слабыми". Поэтому в этом случае view2 должен быть слабым и

  • view1 = strong
  • MainView = слабый (в WindowControllerA)
  • MainView = сильный (в ViewControllerB)
  • view2 = слабый (поскольку mainview уже удерживает его)
  • view3 = слабый (в ViewcontrollerB)
  • view3 = strong (В ViewControllerC)

Ответ 3

Так много обсуждений о слабой и сильной ссылки на .xib-объекты в файловом владельце IBOutlets --- и кажется, что EVERYONE беспокоиться только о представлениях и представлениях.

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

НО: а как насчет всех тех других объектов, которые вы создаете в .xibs регулярно, например NSArrayControllers и тех элементов пользовательского интерфейса на уровне корня, которые не являются представлениями, такими как Windows, Panels, Alerts и т.д. --- ОНИ ссылка сильная? слабый?

Мне действительно нужно какое-то низкоуровневое объяснение того, как работают xibs. Когда объект является "владельцем файла" и загружает файл nib, что загружается и инициализируется? Просто объекты, к которым у вас есть IBOutlets? Каждый объект верхнего уровня?

Кому принадлежат все эти объекты на уровне корня? В конце концов, контроллер, который загружает ниб (и обычно "владелец файла" владеет .xib, но означает ли это, что он владеет (автоматически) объектами корневого уровня в nib?

Если да, то какая разница, если у вас слабая ссылка IBOutlet на объект .xib, или сильный, или вообще нет, вы все еще являетесь "владельцем файла" для этого объекта,

Будет показано более подробное объяснение.

Ответ 4

Если я установил свойство "view1", "MainView (In ViewControllerB)" и "view3 (In ViewControllerC)" на "слабый", что произойдет? Пожалуйста, объясните.