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

IPhone Obj-C: анонимная категория или "private" Категория?

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

@interface MyClass()

@interface MyClass(private)
4b9b3361

Ответ 1

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

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

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

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

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

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

Расширения классов также могут использоваться для повторного использования публично readonly @property как readwrite до @synhesize'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

Да,

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

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

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