Если у вас есть 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 (или объявленное свойство) для доступа к этой розетке. сеттер методы для торговых точек должны их значения...