2010-10-15 2 views
16

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

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

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

ответ

20

@interface Foo() создает расширение класса (я стою исправлен, реквизит на bbum) на интерфейсе Foo, который походит на дополнительные методы, добавленные в интерфейс. Некоторые люди также используют @interafce Foo(Private) (категория) вместо расширения класса с (). Это больше похоже на «внедрение» новых методов в класс вне класса.

Помещение этого в файл .m просто удерживает другие вещи от «просмотра» в файле .h, но это все. В основном люди обычно используют категории или расширения классов в файлах .m для указания частных интерфейсов, но они также используются для таких вещей, как UIKit использует категории для добавления row и section общедоступных методов в NSIndexPath. (Это может сбивать с толку.)

Таким образом, вам не нужно определять частные методы, но если у вас есть метод, называемый bar, который вызывает метод foo, прежде чем foo будет определен в исходном файле, вы получите компилятор предупреждение что-то вроде «объект сам может не отвечать на foo». Вы можете избавиться от этого, указав foo, прежде чем определять бар или любой другой код вызова foo. То же самое происходит с обычными C и функциями.

Как Ole говорит, что это не мешает кому-либо вызвать частные методы, он просто объявляет о своем намерении быть закрытым и заставляет компилятор генерировать предупреждения «не реагировать на», даже если они импортируют файл .h ,

EDIT

Также см http://www.friday.com/bbum/2009/09/11/class-extensions-explained/ некоторого объяснения категорий против расширения класса. Похоже, что расширения классов должны быть более правильными для определения частных методов, с точки зрения компилятора, поскольку методы категорий являются необязательными. Желание моей книги объяснило бы это!

+8

Существует огромная разница между именованными категориями '(foo)' и расширением класса '()'. – bbum

+0

У вас есть ссылка на это? Я ничего не вижу в книге «Программирование в Objective-C 2.0» об этом. Похоже, что название категории просто необязательно из всего, что я могу сказать. Не то, чтобы я был крупным специалистом или что-то еще, но было бы полезно, если бы вы могли предоставить ссылку, объясняющую разницу между (Private) и(). – Nimrod

+0

nevermind, я, кажется, нашел ваш блог http://www.friday.com/bbum/2009/09/11/class-extensions-explained/ Интересно, почему моя книга не говорит об этом? – Nimrod

17

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

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