Разница между категорией и расширением класса?
в чем разница между категорией и расширение класса. Я считаю, что оба используются для добавления пользовательских методов в существующие классы. Может кто-нибудь пролить свет на это? Пример с кодом будет очень признателен.
9 ответов:
категория-это способ добавления методов к существующим классам. Они обычно находятся в файлах под названием " Class + CategoryName.h", например " NSView+CustomAdditions.h" (и .м, конечно).
расширение класса является категорией, за исключением 2 основных отличий:
категория не имеет имени. Он объявляется так:
@interface SomeClass ()@конец- (void) anAdditionalMethod;
реализация расширения должны быть в основном @реализации блок файла.
довольно часто можно увидеть расширение класса в верхней части a .M-файл, объявляющий дополнительные методы в классе, которые затем реализуются ниже в разделе main @implementation класса. Это способ объявить" псевдо-частные " методы (псевдо-частные в том, что они не являются действительно частными, просто не подвергаются внешнему воздействию).
категория
-> в objective c, когда вы хотите добавить еще несколько функций в класс без наследования, вы просто используете категорию для него.
-> он поставляется со своими собственными .h и .файл м
-> категория используется для добавления нового метода не свойства.
расширение класс
-> в objective c, когда вы хотите сделать поведение некоторого свойства частным, вы используете расширение класса.
-> это идет вместе .только файл м.
- > главным образом для свойств.
Примечание: когда мы добавляем новый файл и выбираем опцию objective C category, он показывает категорию и "category on", а не "подкласс", поэтому он показать как
@interface className (categoryName) @end
-вы получите два файла .h и .м с название файл (имякласса+категория.h и className+categoryName.м)
и в случае расширения, вы получаете
@interface className() @end
-вы получите только один файл с именем className_extensionName.h
- в категории вы не являетесь владельцем класса, но в расширении вы есть.
- категория-это способ добавить методы в класс, независимо от того, доступен ли исходный код, означает, что вы можете добавить категорию в базовые классы, такие как NSString, а также в свои собственные пользовательские классы.
расширение может быть добавлено только к классам, исходный код которых доступен, потому что компилятор компилирует исходный код и расширение одновременно.
мы можем добавить дополнительную переменную экземпляра и свойство в расширение класса, но не в Категория.
любая переменная и метод внутри расширения даже не доступны для унаследованного класса.
категория и расширение оба в основном сделаны для обработки большой базы кода, но категория-это способ расширить API класса в нескольких исходных файлах, а расширение-это способ добавить необходимые методы вне основного файла интерфейса.
используйте категорию, когда вам нужно разбить один и тот же код класса на другой источник файл в соответствии с различными функциональными возможностями и расширением, когда вам просто нужно добавить некоторые необходимые методы в существующий класс за пределами основного файла интерфейса. также, когда вам нужно изменить публично объявленную переменную экземпляра в классе. для бывших: 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. Обратите внимание, что мы невозможно создать дополнительные свойства в категории. Также главным преимуществом категорий является то, что мы можем записать категории в любой другой файл, вне файла, где ваш класс выходит.
также при создании категорий вы должны дать ему имя в скобках. Но для расширения имя не требуется. Поэтому иногда они также называется анонимные категории.