Должен ли я объявлять категорию для всех частных методов класса?

Предположим, я хочу, чтобы частный метод класса был видимым для реализации этого класса только так, чтобы интерфейс класса предоставлял только то, что необходимо раскрыть. В некоторых последних версиях Xcode я могу сделать это, просто опуская объявление метода в заголовке. Однако в одной хорошей книге предлагается объявить категорию в файле реализации и объявить в ней этот метод, например:

// [in MyClass.m]
#import "MyClass.h"

// category declaration - is it really required?
// edit: it's a class extension declaration, I know, but it doesn't change much
@interface MyClass ()
- (void)myPrivateMethod;
@end

@implementation MyClass
- (void)myPrivateMethod
{
    // do something
}
// all methods here can call myPrivateMethod
@end

Действительно, он компилируется и работает. Более того, он компилируется и отлично работает без части объявления категории / расширения. Возникает естественный вопрос:

Если у меня есть несколько частных методов, нужно ли мне объявлять их все в категории? Что было бы лучше всего?


person Desmond Hume    schedule 23.07.2012    source источник


Ответы (1)


Это не категория, это расширение класса (обратите внимание, что здесь нет названия категории, круглые скобки пусты).

Это очень хорошая идея - добавить ваши частные методы в расширение класса. Это гарантирует, что все методы имеют объявления и что эти объявления будут видны только в тех частях вашего кода, где вы хотите, чтобы они были видны.

Обратите внимание, что в отличие от обычных категорий, расширения классов позволяют добавлять переменные экземпляра. Это очень удобно, когда ваша реализация полагается на классы, которые не являются частью интерфейса вашего класса.

person Sergey Kalinichenko    schedule 23.07.2012
comment
Я знал, что это расширение, просто привык называть его безымянной категорией в уме. Отказ от этой привычки .. - person Desmond Hume; 23.07.2012
comment
LOL Термин категория никогда не казался мне излишне описательным по какой-то причине; поэтому я продолжаю думать о категориях как о названных расширениях :) - person Sergey Kalinichenko; 23.07.2012
comment
Я предлагаю включить запрет на реализацию методов без предварительного объявления и заставить себя использовать расширение для объявления всех частных методов. Позволяет быстро напомнить себе о деталях реализации. - person bbum; 23.07.2012
comment
@bbum Большое спасибо за отличный совет, я не знал, что возможность проверить это уже существует! С этого момента я буду включать его во всех своих проектах, я уверен, что это поможет мне найти недостающее объявление или два :) - person Sergey Kalinichenko; 23.07.2012
comment
@OscarGomez Расширение - это больше, чем анонимная категория, потому что оно позволяет вам добавлять переменные экземпляра в ваш класс; именованные категории не позволяют этого сделать. - person Sergey Kalinichenko; 23.07.2012
comment
@OscarGomez Это наоборот: extension - это (очень похоже) категория, только без имени. - person Desmond Hume; 23.07.2012
comment
@dasblinkenlight .. Так эта опция находится где-то в настройках сборки или просто у нас в голове? (Я бы предпочел первое) - person Desmond Hume; 23.07.2012
comment
@bbum Я искал эту опцию в настройках компилятора, но самое близкое, что мне удалось найти, - это рассматривать отсутствующие прототипы функций как ошибки. При его включении отсутствующие объявления методов не обнаруживались. Не могли бы вы сообщить мне название этой опции компилятора? - person Sergey Kalinichenko; 23.07.2012
comment
@DesmondHume Я еще не знаю, я спросил у bbum название опции. - person Sergey Kalinichenko; 23.07.2012
comment
@dasblinkenlight Ну, тогда забудьте об этом. Я думаю, что он имел в виду простую самодисциплину. - person Desmond Hume; 23.07.2012
comment
GCC_WARN_UNDECLARED_SELECTOR - необъявленные селекторы в инспекторе настроек. Это связанная и полезная запись в блоге. См. Комментарии. boredzo.org/blog/archives/2009-11-07/warnings - person bbum; 23.07.2012