Как уничтожить (освободить) экземпляры элементов представления, загруженных из файла пера - PullRequest
1 голос
/ 13 февраля 2012

Вопросы:

  • Каждый раз, когда я открываю перо, появляются новые экземпляры предметов в перо. создано, есть ли способ уничтожить (освободить память) их?
  • Или невозможно отменить эти представления и будет до конца приложения?

    Причина запроса: У меня есть 2 представления в отдельных файлах пера, которые необходимо загрузить, и, поскольку я не могу уничтожить элементы представления пера, даже после удаления всех сильных ссылок на представление

Предпринятые шаги (без успеха):

  • установка выходного значения вида контроллера просмотра на ноль
  • Контроллер окна имеет сильное свойство view-контроллера, я установил что до нуля

Мое понимание (на основании некоторого тестирования)

  • Когда я создаю тот же тип представления через код (используя alloc) без загрузки nib-файла (NSBundle loadNibNamed), я могу уничтожить экземпляр представления.
  • но когда представление создается в результате загрузки nib-файла, оно остается включенным, хотя я удалил все сильные ссылки на представление

Примечание: это проект Mac Cocoa, использующий Автоматический подсчет ссылок (ARC)

Детали моего проекта:

  • У меня есть 3 файла пера:
    • MyViewA.nib - содержит настраиваемое представление типа MyViewA
    • MyViewB.nib - содержит настраиваемое представление типа MyViewB
    • MyWindow.nib - содержит NSWindow и пользовательский вид, давайте вызовем это как viewX для справки
  • Существует один оконный контроллер и один контроллер вида
  • MyWindow.nib имеет 2 кнопки, одна кнопка для загрузки MyViewA в качестве подпредставления для viewX и другой для MyViewB, который будет загружен как подпредставление для viewX
  • Я загружаю nib-файлы, используя NSBundle
  • Когда я пытаюсь добавить новое подпредставление в viewX, я удаляю уже существующее подпредставление с помощью removeFromSuperView и удаляю все сильные ссылки на представление

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

1 Ответ

1 голос
/ 13 февраля 2012

Я думаю, что поскольку вы загрузили перо вручную с помощью NSBundle, вам нужно вручную освободить представление. Поскольку вы используете ARC, вы не можете напрямую вызвать release, однако вы можете привести его к void * и использовать CFRelease следующим образом:

CFRelease((__bridge void *)viewToRelease);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...