Подтвердить что ты не робот

Частный интерфейс против частного метода - цель c

В чем разница между частным методом и частным интерфейсом? Например, я знаю, что если вы определяете метод в реализации, и его интерфейс не упоминает об этом, он считается приватным методом. Я также видел такие вещи, как:

@interface Collector()
@property (readonly) NSMutableDictionary *count;
@end

Внутри файла реализации .m.

4b9b3361

Ответ 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/ для некоторого объяснения категорий по сравнению с расширениями классов. Похоже, что расширения классов должны быть более правильными для определения частных методов, с точки зрения компилятора, поскольку методы категорий являются необязательными. Желание моей книги объяснило бы это!

Ответ 2

Objective-C не имеет абсолютно частных методов. Метод, объявленный в разделе частного интерфейса в файле .m, невидим для внешних вызывающих абонентов, но он не является приватным. Если кто-то знает подпись метода и игнорирует предупреждение компилятора, они могут вызвать его извне без проблем.