Назначение категорий Obj-c в конкретной ситуации. - PullRequest
1 голос
/ 05 марта 2012

Я довольно новичок в Objective-C, и у меня есть вопрос:

Я просмотрел пример кода Apple и нашел следующее:

https://developer.apple.com/library/ios/#samplecode/GLSprite/Listings/Classes_EAGLView_m.html#//apple_ref/doc/uid/DTS40007325-Classes_EAGLView_m-DontLinkElementID_4

В верхней части файла я обнаружил использование категорий Objective-C

@interface EAGLView (EAGLViewPrivate)

- (BOOL)createFramebuffer;
- (void)destroyFramebuffer;

@end


@interface EAGLView (EAGLViewSprite)

- (void)setupView;

@end

Сразу после этого начинается реализация класса EAGLView.

Какова реальная цель категорий здесь, так как 3 функции, указанные выше, также могут быть определены непосредственно в заголовочном файле ??

Thx

1 Ответ

6 голосов
/ 05 марта 2012

Как указано именем первой категории («EAGLViewPrivate»), объявление этих методов в файле .m является способом имитации частных методов.Objective-C не имеет истинной поддержки частных методов, но, поскольку они не объявлены в файле .h, компилятор предупредит, когда код вне файла .m, в котором они объявлены, попытается вызвать их.

В наши дни это чаще делается с расширениями класса (особый случай категории), главным образом потому, что использование расширения класса приводит к предупреждению компилятора, если «закрытый» метод не реализован в блоке @implementation класса.Расширения классов были новой функцией в Objective-C 2.0, поэтому в старом коде вы часто видели категорию с частным именем, как в опубликованном вами коде.Цель та же.

...