Разница между категорией и расширением класса? - PullRequest
82 голосов
/ 17 августа 2010

В чем разница между категорией и расширением класса. Я считаю, что оба используются для добавления пользовательских методов в существующие классы. Может кто-то пролить свет на это? Пример с кодом будет очень благодарен.

Ответы [ 9 ]

100 голосов
/ 17 августа 2010

Категория - это способ добавления методов в существующие классы. Они обычно находятся в файлах с именем «Class + CategoryName.h», таких как «NSView + CustomAdditions.h» (и, разумеется, .m).

Расширение класса - это категория, за исключением двух основных отличий:

  1. Категория не имеет названия. Объявлено так:

    @interface SomeClass ()
    
    <pre><code>- (void) anAdditionalMethod;
    </code>
    @ Конец
  2. Реализация расширения должна находиться в главном блоке @implementation файла.

Довольно часто можно увидеть расширение класса в верхней части файла .m, объявляющее о дополнительных методах класса, которые затем реализуются ниже в основном разделе @implementation класса. Это способ объявить «псевдо-приватные» методы (псевдо-приватные в том смысле, что они на самом деле не приватные, просто не подвержены внешним воздействиям).

44 голосов
/ 04 июля 2014
  1. Категория

    => В Objective C, когда вы хотите добавить дополнительные функции в класс без наследования, вы просто используете для него категорию.

    => он поставляется с собственным .h и .m файлом

    => Category используется для добавления нового метода, а не свойств.

  2. Расширение класса

    -> В Objective C, когда вы хотите сделать поведение некоторого свойства приватным, вы используете расширение класса.

    -> он поставляется только с файлом .h .

    -> в основном для недвижимости.

Примечание: когда мы добавляем новый файл и выбираем опцию цели c категория это показывает категорию и "категория на" не "подкласс" так показать как

@interface className (categoryName)
@end

-Вы получите два файла .h и .m с именем файла как ( className + categoryName.h и className + categoryName. м )

и в дополнительном случае вы получите

@interface className()
@end

-Вы получите только один файл с именем className_extensionName.h

  • В категории вы не являетесь владельцем класса, но в расширении вы.
30 голосов
/ 20 февраля 2016
  1. Категория - это способ добавления методов к классу независимо от того, доступен ли исходный код, то есть вы можете добавить категорию к базовым классам, таким как NSString, а также к вашим собственным пользовательским классам.

    Расширение может быть добавлено только к классам, исходный код которых доступен, поскольку компилятор компилирует исходный код и расширение одновременно.

  2. Мы можем добавить дополнительные переменные экземпляра и свойства врасширение класса, но не в категории.

  3. Любая переменная и метод внутри расширения даже недоступны для унаследованных классов.

  4. Категория и расширение какв основном предназначены для обработки большой базы кода, но категория - это способ расширения API класса в нескольких исходных файлах, в то время как расширение - это способ добавления необходимых методов вне основного файла интерфейса.

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

3 голосов
/ 14 октября 2017

Расширение : чтобы сделать методы частными и добавить свойства нашего собственного пользовательского класса, а не класса Apple.

Категория : чтобы добавить дополнительные методы в существующий класс, а не в свойство, его можно использовать как для пользовательского класса, так и для класса Apple, например NSString.

3 голосов
/ 26 июня 2015

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

@interface SomeClass (Private)

@property (nonatomic, assign) id newProperty;

@end

NSString * const kNewPropertyKey = @"kNewPropertyKey";

@implementation SomeClass (Private)

@dynamic newProperty;

- (void)setNewProperty:(id)aObject
{
    objc_setAssociatedObject(self, kNewPropertyKey, aObject, OBJC_ASSOCIATION_ASSIGN);
}

- (id)newProperty
{
    return objc_getAssociatedObject(self, kNewPropertyKey);
}

@end

См .: http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/

2 голосов
/ 13 декабря 2012
@interface SomeClass ()


- (void) anAdditionalMethod;


@end

Я думаю, что это не способ объявить категорию.Категория должна иметь имя

@interface SomeClass (XYZ)


- (void) anAdditionalMethod;


@end

, например

@interface NSMutableArray (NSMutableArrayCreation)

+ (id)arrayWithCapacity:(NSUInteger)numItems;
- (id)initWithCapacity:(NSUInteger)numItems;

@end

Объявлено для NSMutableArray Apple

1 голос
/ 01 декабря 2015

расширение ios похоже на c #, абстрактный класс Java или интерфейс
IOS категории похож на C #, расширение класса Java

0 голосов
/ 08 октября 2017

Вот мое понимание:

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

Расширения должны быть записаны в том же файле, что и класс.Следовательно, вы не можете писать расширения для предопределенных типов, таких как String, Float и т. Д.

С другой стороны, категории можно использовать для добавления дополнительных методов к уже существующим классам.Например, мы можем создавать свои собственные методы, расширяя класс String.Обратите внимание, что мы не можем создать дополнительные свойства в категориях.Также основным преимуществом категорий является то, что мы можем записывать категории в любом другом файле, вне файла, в котором находится ваш класс.

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

0 голосов
/ 24 июля 2015

Категории

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

Расширения

Расширения позволяют вам переопределить свойство или добавить новое свойство в существующий родительский класс. Синтетически то же самое для категорий, у которых нет имени, и они представлены как @interface class (). Файл .m отсутствует, а метод объявлен врасширение должно быть реализовано в @implementation родительского файла

Дополнительная справка по этой ссылке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...