Класс можно расширить в 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
Имеет ли имя категории какое-либо значение для компилятора или компоновщика?Является ли имя категории частью сигнатуры метода в любом случае, или оно является частью примитивного пространства имен?Если название категории не имеет смысла, как вы узнаете, что собираетесь потоптать другой метод и получить неопределенное поведение?