Ответ 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