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

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

Ответ 1

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

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

  • У категории нет имени. Он объявляется следующим образом:

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

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

Ответ 2

  1. категория

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

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

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

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

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

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

    → в основном для свойств.

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

@interface className (categoryName)
@end

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

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

@interface className()
@end

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

  • В категории вы не являетесь владельцем класса, но в расширении вы являетесь.

Ответ 3

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

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

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

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

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

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

Ответ 4

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

@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

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

Ответ 5

@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

Ответ 6

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

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

Ответ 7

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

ios похожа на С#, расширение класса Java

Ответ 8

Категория

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

Расширения

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

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

Ответ 9

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

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

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

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

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