Частный интерфейс против частного метода - цель c - PullRequest
16 голосов
/ 15 октября 2010

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

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

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

Ответы [ 2 ]

20 голосов
/ 15 октября 2010

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

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

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

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

EDIT

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

17 голосов
/ 15 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...