Иногда вы можете обнаружить, что хотите расширить существующий класс, добавив поведение, которое полезно только в определенных ситуациях. Чтобы добавить такое расширение к существующим классам, Objective-C предоставляет категории и расширения .
Если вам нужно добавить метод к существующему классу, возможно, чтобы добавить функциональность, чтобы упростить выполнение чего-либо в вашем собственном приложении, самый простой способ — использовать категорию.
Синтаксис для объявления категории использует ключевое слово @interface, как и стандартное описание класса Objective-C, но не указывает на какое-либо наследование от подкласса. Вместо этого в скобках указывается название категории, например:
@interface ClassName (CategoryName) @end
Характеристики категории
-
Категория может быть объявлена для любого класса, даже если у вас нет исходного кода реализации.
-
Любые методы, которые вы объявляете в категории, будут доступны для всех экземпляров исходного класса, а также для любых подклассов исходного класса.
-
Во время выполнения нет никакой разницы между методом, добавленным категорией, и тем, который реализован исходным классом.
Категория может быть объявлена для любого класса, даже если у вас нет исходного кода реализации.
Любые методы, которые вы объявляете в категории, будут доступны для всех экземпляров исходного класса, а также для любых подклассов исходного класса.
Во время выполнения нет никакой разницы между методом, добавленным категорией, и тем, который реализован исходным классом.
Теперь давайте посмотрим на пример реализации категории. Давайте добавим категорию к классу какао NSString. Эта категория позволит нам добавить новый метод getCopyRightString, который поможет нам вернуть строку авторских прав. Это показано ниже.
#import <Foundation/Foundation.h> @interface NSString(MyAdditions) +(NSString *)getCopyRightString; @end @implementation NSString(MyAdditions) +(NSString *)getCopyRightString { return @"Copyright TutorialsPoint.com 2013"; } @end int main(int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *copyrightString = [NSString getCopyRightString]; NSLog(@"Accessing Category: %@",copyrightString); [pool drain]; return 0; }
Теперь, когда мы скомпилируем и запустим программу, мы получим следующий результат.
2013-09-22 21:19:12.125 Categories[340:303] Accessing Category: Copyright TutorialsPoint.com 2013
Даже если любые методы, добавленные категорией, доступны для всех экземпляров класса и его подклассов, вам потребуется импортировать файл заголовка категории в любой файл исходного кода, где вы хотите использовать дополнительные методы, иначе вы столкнетесь с предупреждения и ошибки компилятора.
В нашем примере, поскольку у нас есть только один класс, мы не включили заголовочные файлы, в таком случае мы должны включить заголовочные файлы, как сказано выше.