Два синтаксиса служат разным целям.
Именованная категория - @ 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