Переменные экземпляра IBOutlet в файлах реализации (.m)

Предположим, что у меня есть контроллер вида или оконный контроллер, который (как обычно) является "владельцем файлов" в соответствующем файле XIB.

Это (как вам известно) очень распространено, чтобы иметь IBOutlet в классе контроллера, который затем можно подключить в XIB с помощью Interface Builder.

До сих пор я создавал переменные экземпляра IBOutlet в моих файлах интерфейса (.h). Но (как вы все знаете) IBOutlet очень часто являются частным механизмом класса контроллера; аутсайдеры даже не знают о них.

Вот почему я теперь, так как Objective-C недавно начал предлагать такую ​​возможность - хочу поместить все мои IBOutlet в мои файлы реализации (.m).

Я попытался сделать это, и это, похоже, работает нормально. Мои вопросы таковы: Почему это работает? У меня создалось впечатление, что Interface Builder может просматривать только файлы заголовков классов, а не просматривать их файлы реализации. Я ошибаюсь? Как этот интерфейс Builder может "видеть в" файлы реализации? Может ли быть потенциально опасным помещать переменные экземпляра IBOutlet в файлы реализации?

Ответы

Ответ 1

Из Руководство пользователя Xcode 4

Примечание. Поскольку Xcode 4 анализирует оба файла заголовка и реализацию файлы для индексирования, вы можете определить действия и выходы в (.m) без необходимости их размещения в заголовке файл, и вы можете подключаться непосредственно из файла nib к файл реализации. Поэтому вам не нужно выставлять части ваш интерфейс или действия для клиентов, которые могут использовать ваши классы.

И для Может ли быть потенциально опасным помещать переменные экземпляра IBOutlet в файлы реализации?

Да, это так, но не так, как может быть доступен любой объявленный метод из-за отсутствия области доступа во время выполнения. Даже если метод недоступен, разрешение выполняется во время выполнения, и к методу не привязана информация о доступе. Это могло быть реализовано, но Objective-C не хватает private, protected и т.д., Как на С++ или Java. Обратите внимание, что реализация такого поведения будет намного медленнее во время выполнения.