Если у вас есть IBOutlet, но не свойство, оно сохраняется или нет?

Я считаю, что документация по этой проблеме неясна:

Скажите, что вы работаете с iOS (не в случае с Mac, не нужно упоминать различия). Скажем, это строго 4.0+ (не нужно упоминать различия в старой ОС). Скажем, мы загружаем NIB строго автоматически.

Скажем, у вас есть UIViewController, BigView. Скажем, в файле NIB есть дюжина так называемых элементов "верхнего уровня"... могут быть пользовательские элементы управления, изображения или что-то еще.

Скажите, что вы определенно собираетесь явно создавать, а затем избавляться от BigView несколько раз во время запуска приложения. Итак:

Для одного из этих элементов верхнего уровня в NIB существуют три возможности:

(1) У вас нет какого-либо IBOutlet для него.

(2) У вас есть подключенный IBOutlet - но не свойство.

(3) У вас есть связанное свойство IBOutlet (во избежание путаницы мы скажем свойство сохранения).

Итак, что происходит с элементом при выпуске BigView?

В случае (3) кажется ясным, что вы должны явно опубликовать. Если вы этого не сделаете, он будет зависать после того, как представление исчезнет. Нет проблем.

В случае (1) я предполагаю (, но может ли кто-нибудь на самом деле подтвердить?), что элемент будет выпущен, когда BigView исчезнет.

В случае (2) не понятно, что происходит.......

Глядя на известную ссылку ссылки: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html, это очень сомнительно:

"В iOS код nib-загрузки использует метод setValue: forKey: для повторного подключения к каждой розетке. Этот метод аналогичным образом ищет подходящий метод доступа и [SO WHAT HAPPENS, ЕСЛИ ЕСТЬ НЕ ОДИН?..] возвращается к другим средствам, когда это не удается... [GOOD GRIEF!]"

И ознакомьтесь с этой документацией: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html и прокрутите вниз до "Сохранение объекта Nib"

Итак...

"Объекты в файле nib создаются с сохранением числа 1, а затем автореализовываются" Фантастические..

Но подождите! Прочтите несколько слов...

однако..., который использует доступный метод setter или сохраняет объект по умолчанию, если не доступен метод setter

О чем они говорят?

Они означают, что если нет сеттера (ivar, но нет свойства), что он СНОВА RETAINED (кроме "сохранить", которые они просто упоминают в предыдущем пункте) --- или, они просто повторяются, т.е. "сохраняет объект по умолчанию" - это то же самое "удержание", о котором они говорили непосредственно ранее ( "созданный с сохранением числа 1, а затем автореализованным" ).

И почему они даже упоминают автореферат, если это не то, что происходит?

В самом деле - если кто-то действительно знает ответ на этот вопрос...... , как вы знаете?!? Вы спрашивали DTS или через тестирование или? Я предлагаю, ключевая документация (только что вставленная) агрессивно неясна.

Опять же - если у вас есть IBOutlet, , но не свойство, подключенное к объекту верхнего уровня. вы несете ответственность за его выпуск? Сохранено ли оно? в этой ситуации?

Если уж на то пошло... только в ситуации (1), это абсолютно так, что вещь будет выпущена, когда BigView уйдет? Я бы предположил, что это так, но кто знает?

Вопрос в том, что произойдет, если вы используете IBOutlet iVar, но НЕ свойство...

Я глупо никогда не думал об этом раньше/предполагал слишком много, кто-нибудь имеет решающий ответ? Ура!!


Для записи я сделал тестовый проект.

На самом деле (неожиданно для меня) простой акт подключения элемента IB к IBOutlet фактически добавляет один элемент сохранения.

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

Итак, это ответ.

Я отправлю демонстрационный проект. Я также направляю всех читателей на ответ Ионы ниже, который безупречно объясняет поведение setValue: forKey: Cheers

Ответ 1

Я не вижу, что вызывает такую ​​путаницу, я думаю, что документация "Сохранение объекта Nib" объясняет, что именно происходит. Позвольте сломать его и пройти через то, что происходит:

Объекты в файле nib создаются с сохранением числа 1 и затем автоматически сохраняются.

ClassLoadedFromNib *loadedObject = [[[ClassLoadedFromNib alloc] initWithCoder:coder] autorelease];

Однако, поскольку он восстанавливает иерархию объектов, UIKit повторно устанавливает соединения между объектами, используя метод setValue: forKey:,
[filesOwner setValue:loadedObject forKey:nameOfIBOutlet];

который использует доступный метод setter или сохраняет объект по умолчанию, если не доступен метод setter.

Поведение -setValue:forKey: по умолчанию в iOS по умолчанию

//lazy pseudocode
if ([self respondsToSelector:@selector(@"setKeyName:")]) {
  [self setKeyName:value];
}
else {
  object_setIvar(self, _keyName, [value retain]);
}

Более подробную информацию см. в руководстве по программированию по ключевым словам. Если объект владельца файла не переопределяет -setValue:forKey: (или +accessInstanceVariablesDirectly и -setValue:forUndefinedKey:), то следует ожидать, что управление объектом будет осуществляться, как указано выше.


Если вы определяете выходные данные для объектов nib файла, вы всегда должны определять метод setter (или объявленное свойство) для доступа к этой розетке. Методы setter для торговых точек должны сохранять свои значения, а методы настройки для выходов, содержащих объекты верхнего уровня, должны сохранять свои значения, чтобы предотвратить их освобождение.

Разрешить загрузку nib, чтобы установить ivar непосредственно на объекты, оставленные снаружи, сбивает с толку. Не делай этого. Предоставьте методы настройки для ваших торговых точек, чтобы владение загруженным объектом было ясным.


Если вы не храните объекты верхнего уровня в торговых точках, вы должны сохранить либо массив, возвращаемый методом loadNibNamed: owner: options: или объекты внутри массива, чтобы предотвратить их преждевременное освобождение.

Объекты, не подключенные к розеткам, были автореализованы. Сохраните их или массив, возвращенный из -loadNibNamed: owner: options: если вы попытаетесь получить к ним доступ позже.

Ответ 2

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

Ответ 3

Случай 1) Если объект не сохранен ничем, он будет освобожден при следующем утечке пула авторекламы.

Случай 2). В ответ, о котором вы говорили выше, Джон Хесс уже описал (со ссылкой на документацию) различия между Mac OS X и iOS для этого случая.

Джон Хесс прав или правильно ли Фримен?

В iOS случае Хесс и Фримен говорят, что объект будет сохранен. Между ними нет противоречия.

По-прежнему настоятельно рекомендуется иметь методы настройки для всех выходов:

Руководство по программированию ресурсов, файлы Nib

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