Учебники

Objective-C Категории

Иногда вы можете обнаружить, что хотите расширить существующий класс, добавив поведение, которое полезно только в определенных ситуациях. Чтобы добавить такое расширение к существующим классам, Objective-C предоставляет категории и расширения .

Если вам нужно добавить метод к существующему классу, возможно, чтобы добавить функциональность, чтобы упростить выполнение чего-либо в вашем собственном приложении, самый простой способ — использовать категорию.

Синтаксис для объявления категории использует ключевое слово @interface, как и стандартное описание класса Objective-C, но не указывает на какое-либо наследование от подкласса. Вместо этого в скобках указывается название категории, например:

@interface ClassName (CategoryName)

@end

Характеристики категории

  • Категория может быть объявлена ​​для любого класса, даже если у вас нет исходного кода реализации.

  • Любые методы, которые вы объявляете в категории, будут доступны для всех экземпляров исходного класса, а также для любых подклассов исходного класса.

  • Во время выполнения нет никакой разницы между методом, добавленным категорией, и тем, который реализован исходным классом.

Категория может быть объявлена ​​для любого класса, даже если у вас нет исходного кода реализации.

Любые методы, которые вы объявляете в категории, будут доступны для всех экземпляров исходного класса, а также для любых подклассов исходного класса.

Во время выполнения нет никакой разницы между методом, добавленным категорией, и тем, который реализован исходным классом.

Теперь давайте посмотрим на пример реализации категории. Давайте добавим категорию к классу какао NSString. Эта категория позволит нам добавить новый метод getCopyRightString, который поможет нам вернуть строку авторских прав. Это показано ниже.

Live Demo

#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

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

В нашем примере, поскольку у нас есть только один класс, мы не включили заголовочные файлы, в таком случае мы должны включить заголовочные файлы, как сказано выше.