Ответ 1
@interface Foo()
создает расширение класса (я стою исправлено, реквизит на bbum) на интерфейсе Foo, который походит на дополнительные методы, добавленные в интерфейс. Некоторые люди также используют @interafce Foo(Private)
(category) вместо расширения класса с ()
. Это больше похоже на "enter" новых методов в класс извне класса.
Размещение этого в .m файле просто заставляет другие вещи "видеть это" в файле .h, но это так. В основном люди обычно используют категории или расширения классов в файлах .m для указания частных интерфейсов, но они также используются для таких вещей, как UIKit использует категории для добавления row
и section
общедоступных методов в NSIndexPath. (Это может сбивать с толку.)
Вам действительно не нужно определять частные методы таким образом, но если у вас есть метод, называемый bar, который вызывает метод foo, прежде чем foo будет определен в исходном файле, вы получите предупреждение о компиляторе что-то вроде "object self can not отвечать на foo". Вы можете избавиться от этого, указав foo, прежде чем определять бар или любой другой код вызова foo. То же самое с обычными C и функциями.
Как говорит Ole, это не мешает кому-либо вызвать частные методы, он просто объявляет о своем намерении быть закрытым и заставляет компилятор генерировать предупреждения "не реагировать на", даже если они импортируют файл .h.
ИЗМЕНИТЬ
Также см. http://www.friday.com/bbum/2009/09/11/class-extensions-explained/ для некоторого объяснения категорий по сравнению с расширениями классов. Похоже, что расширения классов должны быть более правильными для определения частных методов, с точки зрения компилятора, поскольку методы категорий являются необязательными. Желание моей книги объяснило бы это!