2013-07-25 3 views
3

Учитывая, что iOS SDK 6.1 используется в Xcode 4.6.3, имеет значение, чтобы объявить подпись метода IBAction в файле заголовка или нет?Должен ли я помещать IBActions в заголовочный файл или нет?

Не помещая объявление метода в файл заголовка, приложение все еще может компилироваться и запускаться без проблем. Однако этот метод нельзя увидеть в раскадровке.

Есть ли скрытые проблемы не декларирования метода в файле заголовка? Есть ли разница в потреблении памяти?

+1

Это для поддержки инкапсуляции (oop) из того, что я могу сказать. вы можете скрыть метод из открытого интерфейса и связать его с кодом на выходе. Делая это, вы скрываете реализацию от совместимого интерфейса. Но я hink, если вы объявите метод в категории @interface classname(), вы можете увидеть метод в построителе интерфейса. – Radu

ответ

1

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

Слово IBAction само по себе является #define d as void. Его единственная цель (и то же самое относится к IBOutlet) - позволить Xcode сканировать ваш код и находить эти точки, где ваш контроллер должен быть подключен к просмотру через IB. Вам не нужна часть декларации IBAction, если вы программно подключаете элемент управления к этому методу.

Существует не разница в производительности, но семантически, размещение IBAction в вашем файле реализации на самом деле не имеет смысла. Наличие IBAction означает, что контроллер взаимодействует с внешним объектом с помощью этого метода, и это именно то, что для заголовков/общедоступных объявлений @interface.

+5

Я не знаю, согласен ли я с этим. Почему это нужно публично? Я использую методы 'IBAction' для выполнения внутренней логики все время. На принципе инкапсуляции, не хочу ли я показывать ее только через публичный интерфейс, если я действительно нуждаюсь в ней? Похоже, что Apple, возможно, поняла это, и именно поэтому они добавили поддержку перетаскивания действий непосредственно в файлы реализации на пару версий Xcode. Пожалуйста, поправьте меня, где я ошибаюсь, но я бы с удовольствием согласился на это. –

+0

Я не уверен, что могу выразить это более четко, чем в своем ответе. Кнопка, которая подключена к 'IBAction' в вашем объекте _isn't_ internal. Он находится вне вашего объекта - это часть представления иерархии; он имеет отношения с окружающими его взглядами. 'IBAction' и 'IBOutlet' являются точками соединения по определению. –

+3

Я только что прочитал документы разработчиков на 'IBAction' и 'IBOutlet' и не может найти никаких требований или упоминания об их публичности. Откуда вы получили свое определение «IBAction» как «точка общественного подключения»? Невозможно ли использовать частную точку подключения? Например, скажем, у меня есть экран входа в систему с подключенным loginButtonAction.Я не хочу раскрывать эту функциональность для любых классов, внешних по отношению к моему контроллеру входа в систему, поэтому зачем мне помещать IBAction в заголовок/публичный '@ interface'? –

1

Только объявите его в файле .h, если вы хотите подключить его в своем построителе раскадровки/межфазного пространства, или вы хотите сделать его общедоступным для других классов, чтобы позвонить ему.

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

Не существует различий в памяти или производительности.

0

Даже если вы планируете подключить его к конструктору интерфейса, он все равно не находится в файле заголовка. Я лично просто помещаю их прямо в файл реализации.

Смежные вопросы