В чем разница между категорией и расширением класса. Я считаю, что оба используются для добавления пользовательских методов в существующие классы. Может кто-нибудь пролить свет на это? Мы будем очень благодарны за пояснения с кодом.
objective-c
Абхинав
источник
источник
Ответы:
Категория - это способ добавления методов к существующим классам. Обычно они находятся в файлах с именем «Class + CategoryName.h», например «NSView + CustomAdditions.h» (и, конечно, .m).
Расширение класса - это категория, за исключением двух основных отличий:
Категория не имеет названия. Заявлено это так:
@interface SomeClass ()
@конецРеализация расширения должна находиться в основном блоке @implementation файла.
Довольно часто можно увидеть расширение класса в верхней части файла .m, объявляющее дополнительные методы класса, которые затем реализуются ниже в основном разделе @implementation класса. Это способ объявления «псевдоприватных» методов (псевдо-частных в том смысле, что они не совсем частные, просто не доступны извне).
источник
=> В Objective C, когда вы хотите добавить к классу дополнительные функции без наследования, вы просто используете для него категорию.
=> у него есть собственные файлы .h и .m
=>
Category
используется для добавления нового метода, а не свойств.-> In Objective C, when you want to make behaviour of some property private you use class extension. -> it comes with **.h** file only. -> mainly for properties.
@interface className (categoryName) @end
-Вы получите два файла .h и .m с именем файла как ( className + categoryName.h и className + categoryName.m )
и в случае продления вы получите
@interface className() @end
-Вы получите только один файл с именем className_extensionName.h
источник
Категория - это способ добавления методов к классу независимо от того, доступен ли исходный код или нет, то есть вы можете добавить категорию к базовым классам, например,
NSString
а также к своим собственным настраиваемым классам.Расширение можно добавить только к классам, исходный код которых доступен, поскольку компилятор компилирует исходный код и расширение одновременно.
Мы можем добавить дополнительные переменные экземпляра и свойства в расширение класса, но не в категорию.
Любая переменная и метод внутри расширения недоступны даже для унаследованных классов.
Категория и расширение в основном созданы для обработки большой базы кода, но категория - это способ расширения API класса в нескольких исходных файлах, а расширение - это способ добавления необходимых методов за пределами основного файла интерфейса.
Используйте категорию, если вам нужно разбить код одного и того же класса на разные исходные файлы в соответствии с различными функциями, и расширение, когда вам просто нужно добавить некоторые необходимые методы к существующему классу за пределами основного файла интерфейса. Кроме того, когда вам нужно изменить публично объявленную переменную экземпляра в классе, например, только для чтения для чтения и записи, вы можете повторно объявить ее в расширении.
источник
Расширение : сделать методы частными и добавить свойства нашего собственного настраиваемого класса, а не класса Apple.
Категория : чтобы добавить больше методов в существующий класс, а не в свойство, его можно использовать как для пользовательского класса, так и для класса Apple, например
NSString
.источник
Мы также можем иметь свойства, используя набор связанных свойств в классе категорий.
@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
Заявлено Apple для NSMutableArray
источник
Расширение ios похоже на C #, абстрактный класс java или интерфейс
категории ios аналогично C #, расширение класса java
источник
Категории
Категории используются, когда вы создаете файл, содержащий большое количество методов. Таким образом, они предоставляют вам возможность разбить один класс на разные модули. Также, если какие-либо изменения внесены в категории, компилятор не тратит время на компиляцию всего проекта. .Категории не могут добавлять новую переменную или свойства и искать их в родительском классе. Вы можете переопределить метод в категории, но это не очень хорошая идея, потому что метод не может быть переопределен. Кроме того, поток может быть выполнен, потому что все категории имеют один и тот же иерархический уровень и, следовательно, две категории, принадлежащие одному родительскому классу, могут существовать во время выполнения.Также могут быть созданы защищенные методы с использованием категорий
Расширения
Расширения позволяют вам переопределить свойство или добавить новое свойство к существующему родительскому классу. Синтаксически то же самое для категорий, у которых нет имени, и представлены как @interface class () .m файл отсутствует, и метод, объявленный в расширении, необходимо реализовать в @ реализации родительского файла
Дополнительная помощь по этой ссылке
источник
Вот мое понимание:
Расширения обычно используются для добавления дополнительных функций в наш собственный « пользовательский класс ». Мы можем добавить частные методы или свойства, расширяющие интерфейс класса, которые можно использовать в реализации класса.
Расширения должны быть записаны в том же файле, что и класс. Следовательно, вы не можете писать расширения для предопределенных типов, таких как String, Float и т. Д.
С другой стороны, категории можно использовать для добавления дополнительных методов к уже существующим классам. Пример: мы можем создавать наши собственные методы, расширяя класс String. Обратите внимание, что мы не можем создавать дополнительные свойства в категориях. Также основным преимуществом категорий является то, что мы можем записывать категории в любом другом файле, за пределами файла, из которого выходит ваш класс.
Также при создании категорий вы должны дать ей имя в скобках. Но для расширения имя не требуется. Поэтому иногда их также называют анонимными категориями.
источник