Переменные экземпляра 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.
Обратите внимание, что реализация такого поведения будет намного медленнее во время выполнения.