Класс может быть расширен в Objective C с использованием такой категории, как:
@interface NSString (CategoryName)
-(NSString *)myFabulousAddition; // a fabulous additional method
@end
/////////////////////////////
@implementation NSString (CategoryName)
-(NSString *)myFabulousAddition {
// do something fabulous...
}
@end
В этом маленьком примере я бы добавил метод myFabulousAddition
в NSString. Тогда я мог бы называть его [anNSString myFabulousAddition]
так же, как если бы он был частью набора методов NSString. Отличный и полезный.
В документах Apple, касающихся категорий, состояние документов:
Нет ограничений на количество категорий, которые вы можете добавить к класса, но каждое имя категории должно быть разные, и каждый должен объявить и определите другой набор методов.
Что делать, если у вас есть что-то вроде этого:
@interface NSString (CategoryName)
-(NSString *)myFabulousAddition; // a fabulous additional method
@end
@interface NSString (ANOTHERCategoryName)
-(NSString *)myFabulousAddition; // a DIFFERENT fabulous additional method
// BUT with same name as the other category
@end
/////////////////////////////
@implementation NSString (CategoryName)
-(NSString *)myFabulousAddition {
// do something fabulous...
}
@end
@implementation NSString (ANOTHERCategoryName)
-(NSString *)myFabulousAddition {
// do something equally fabulous, but DIFFERENT...
}
@end
Отсутствие имени в скобках указывает, что форма является расширением для класса, например:
@interface MyObject () // No name -- an extension vs category to MyObject
- (void)setNumber:(NSNumber *)newNumber;
@end
Имеет ли название категории какое-либо значение для компилятора или компоновщика? Является ли имя категории частью подписи метода в любом случае или является частью примитивного пространства имен? Если название категории бессмысленно, как вы узнаете, собираетесь ли вы топать по другому методу и получить поведение undefined?