Я вижу категории как своего рода более простой способ достижения некоторых функций, предоставляемых наследованием.Существуют и другие категории, которые не наследуются.Категории позволяют расширять функциональность существующего класса, не разбивая его на подклассы.Вы также можете использовать их для замены существующих методов в классах.Метод категории в некотором роде привязан к существующему классу в отличие от подкласса, который направляет потомка исходного класса.Как только метод категории добавлен в целевой класс c, он становится доступным для всех экземпляров класса, включая те, которые не созданы вами.
Например, если вам нужна функция шифрования, которую необходимо использовать для всех данныхв вашем проекте и говорят, что большинство ваших данных использует только NString для сохранения и манипуляции.Один из способов сделать это - создать категорию для NSString
NSString-Encryption.h
@interface NSString (Encryption)
-(NSString*) encrypt;
@end
NSString-Encryption.m
#import "NSString-Encryption.h"
@implementation NSString (Encryption)
-(NSString*) encrypt
{
// your encryption method here
return encryptedString;
}
@end
UseNSString-encryption.m
NSString *testString = @"this is test";
NSString *encryptedString = [testString encrypt];
Как видно, эту категорию проще использовать, чем подкласс.Этот метод может быть вызван из NSMutableString также, поскольку он наследуется от NSString.Так что это мощно.
Вы также можете использовать категорию для замены существующих методов в классах.
Другое использование категории заключается в том, что она может использоваться для частных методов , поскольку цель c не имеет формального частного обозначения для методов.Это делается путем помещения категории в файл .m вместо файла .h.
Phone.h
@interface Phone:NSObject
-(void) call;
@end
Phone.m
@interface Phone(Private)
-(void) validatePhoneEntry:(NSString*) phoneNumber;
@end
@implementation Phone
-(void) validatePhoneEntry:(NSString*) phoneNumber
{
}
-(void) call
{
}
@end
Недостатком категорий является то, что вы не можете использовать их, если вам нужно добавить переменную-член в классы.