Разница между категорией и расширением класса?


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

9 79

9 ответов:

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

расширение класса является категорией, за исключением 2 основных отличий:

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

    @interface SomeClass ()
    
    
    - (void) anAdditionalMethod;
    
    @конец
  2. реализация расширения должны быть в основном @реализации блок файла.

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

  1. категория

    -> в objective c, когда вы хотите добавить еще несколько функций в класс без наследования, вы просто используете категорию для него.

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

    -> категория используется для добавления нового метода не свойства.

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

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

    -> это идет вместе .только файл м.

    - > главным образом для свойств.

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

@interface className (categoryName)
@end

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

и в случае расширения, вы получаете

@interface className()
@end

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

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

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

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

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

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

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

мы также можем иметь свойства, используя set associated property в классе category.

@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/

@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

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

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

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

категории

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

расширения

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

больше помочь этой ссылке

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

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

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

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

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