Анонимная категория или "частная" категория - это одно и то же? - PullRequest
17 голосов
/ 27 июня 2009

По стилю (и функционально, если есть какая-либо разница) для объявления частных методов, какой из них лучше?

@interface MyClass()

@interface MyClass(private)

Ответы [ 2 ]

41 голосов
/ 28 июня 2009

Два синтаксиса служат разным целям.

Именованная категория - @ interface Foo (FooCategory) - обычно используется для:

(1) расширить существующий класс, добавив функциональность. Пример: NSAttributedString в Foundation расширяется категорией в AppKit, в которую добавлен специфичный для RTK API API форматирования текста, подобный AppKit.

(2) объявляет набор методов, которые могут или не могут быть реализованы делегатом. Пример: различные классы объявляют - но не реализуют - @interface NSObject (SetODelegateMethods).

Форма (2) утратила популярность теперь, когда @protocol был расширен для поддержки методов @optional в Objective-C 2.0.

Расширение класса - @ interface Foo () - разработано, чтобы позволить вам объявлять дополнительный частный API - SPI или интерфейс системного программирования - который используется для реализации внутренних классов. Это обычно появляется в верхней части .m файла. Любые методы / свойства, объявленные в расширении класса, должны быть реализованы в @implementation, точно так же, как методы / свойства, найденные в public @ interface.

Расширения классов также могут использоваться для объявления открытого для чтения @property как readwrite до @ synthesize'ing методов доступа.

Пример:

foo.h

@interface Foo:NSObject
@property(readonly, copy) NSString *bar;
-(void) publicSaucing;
@end

Foo.m

@interface Foo()
@property(readwrite, copy) NSString *bar;
- (void) superSecretInternalSaucing;
@end

@implementation Foo
@synthesize bar;
.... must implement the two methods or compiler will warn ....
@end
2 голосов
/ 27 июня 2009

Да,

Существуют следующие различия.

1) Использование анонимных категорий требует реализации его методов в основном блоке @implementation для соответствующего класса; анонимные категории позволяют вам объявить дополнительный необходимый API для класса в местах, отличных от основного класса @interface block

2) При использовании MyClass (private) необходимо учитывать следующее: именованные пары объект / категория должны быть уникальными. Если вы объявите частную категорию в своем классе, то проблем не будет. Однако в существующих классах все по-другому. Например, только одна категория NSString (Private) может существовать в данном пространстве имен Objective C. Это может привести к проблемам, потому что пространство имен Objective C совместно используется кодом программы и всеми библиотеками, средами и плагинами. Это особенно важно для программистов Objective C, пишущих заставки, панели настроек и другие плагины, потому что их код будет введен в код приложения или инфраструктуры, который они не контролируют.

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