В чем разница между категорией и расширением класса. Я считаю, что оба используются для добавления пользовательских методов в существующие классы. Может ли кто-нибудь пролить свет на это? Экзамен с кодом будет действительно оценен.Разница между категорией и расширением класса?
ответ
Категория - это способ добавления методов к существующим классам. Обычно они находятся в файлах, называемых «Class + CategoryName.h», например «NSView + CustomAdditions.h» (и .m, конечно).
Расширение класса является категорией, для 2-х основных отличий, кроме:
Категория не имеет названия. Он объявлен как это:
@interface SomeClass()
@end- (void) anAdditionalMethod;
Реализация расширения должна быть в основном блоке @implementation файла.
Это довольно часто можно увидеть расширение класса в верхней части .m файл объявляющего больше методов класса, которые затем реализованы ниже в главном @implementation секции класса. Это способ объявить «псевдо-частные» методы (псевдо-частные в том смысле, что они не являются частными, а не внешними).
Большое вам спасибо. – Abhinav
В Class-Extensiosn вы можете переписать свойства из (общедоступного) свойства только для чтения, чтобы быть внутренне readwrite. И поскольку LLVM 1.5 вы можете сделать еще больше: теперь вы можете объявить переменные экземпляра в расширении класса, чтобы они исчезли из обычного интерфейса. –
Зачем добавлять расширение класса, когда вы могли бы просто реализовать эти методы и свойства в классе? Кажется немного лишним для меня. – user1721803
@interface SomeClass()
- (void) anAdditionalMethod;
@end
Я думаю, что это не способ объявить категорию. Категория должен иметь имя
@interface SomeClass (XYZ)
- (void) anAdditionalMethod;
@end
, например
@interface NSMutableArray (NSMutableArrayCreation)
+ (id)arrayWithCapacity:(NSUInteger)numItems;
- (id)initWithCapacity:(NSUInteger)numItems;
@end
Заявленный для NSMutableArray Яблоком
Вот как вы объявляете и расширяете, а не категорию -> @interface SomeClass() – ChavirA
категории
-> В Objective C, когда вы хотите добавить некоторые дополнительные функции для класса без наследования, вы просто используете catego за него.
-> он пришел со своим собственным .h и .m файл
-> использование Категории добавить новый метод не свойство.
расширение класса
-> В Objective C, если вы хотите, чтобы сделать поведение некоторых свойств частного использовать расширение класса.
-> он поставляется только с файлом .m.
-> главным образом для объектов.
Примечание: при добавлении нового файла и выберите опцию Objective C категории это показать категорию и «категории на» не «подкласс» так показать, как
@interface className (categoryName)
@end
-вы получите два файла.ч и .m с именем файла (Classname + categoryName.h и Classname + categoryName.m)
и удлинительной случае вы получаете
@interface className()
@end
-вы получить только один файл с именем className_extensionName.h
- В категории Вы не являетесь владельцем данного класса, но в его расширении.
@Prasanna: расширение класса поставляется только с файлом .m, но не в .h – Saggy
@Saggy thsks для исправления –
У нас также могут быть свойства Использование свойства 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
См: http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/
Категории
Категории, используемые при создании файла, содержащего большое количество methods.So они предоставляют вам средство, чтобы разорвать один класс в разные modules.Also если какие-либо изменения внесены в категории, компилятор не тратит время на компиляцию всего проекта. Кадры не могут добавить новую переменную или свойства и посмотреть на их родительский класс. Вы можете переопределить метод в категории, но это не хорошо потому что метод не может быть переопределен. Кроме того, вл может быть осуществлено, поскольку все категории имеют одинаковый уровень иерархического и, следовательно, две категорий, принадлежащие к тому же родительскому классу может существовать при пробеге time.Also защищаемых методы могут быть созданы с использованием категориями
Расширения
Расширения позволяют переопределить свойство или добавить новое свойство к существующему родительскому классу. Синхронно же к категориям они не имеют имени и представлены как @interface class() Нет .m-файла присутствует, а метод, объявленный в расширении, должен быть реализован в @implementation parent файл
Дополнительная информация по телефону this ссылка
расширение ИОС похож на C#, Java абстрактный класс или интерфейс
ИОС категории похож на C#, расширение класса Java
ваш ответ так же, как «Кошка похожа на тигра, отвечающего на слепого». Lol –
на самом деле. Это самое прямое и быстрое объяснение, если вы знаете C# или java. – Add080bbA
- Категория способ добавить методы класса, является ли доступен исходный код подразумевает вы можете добавить категорию в классы фундамента, такие как NSString, а также свои собственные пользовательские классы.
Расширение может быть добавлено только в классы, исходный код которых доступен, поскольку компилятор одновременно компилирует исходный код и расширение.
Мы можем добавить дополнительную переменную экземпляра и свойство в расширение класса, но не в категории.
Любые переменные и методы внутри расширения даже не доступны для унаследованного класса.
Категория и расширение, как правило, предназначены для обработки большой базы кода, но категория - это способ расширения API класса в нескольких исходных файлах, а расширение - способ добавления необходимых методов из основного файла интерфейса.
Используйте категорию, если вам нужно разбить один и тот же код класса в другом исходном файле в соответствии с различными функциями и расширением, когда вам просто нужно добавить некоторые необходимые методы к существующему классу за пределами основного файла интерфейса. также, когда вам нужно изменить публично объявленную переменную экземпляра в классе. например: readonly to readwrite вы можете повторно объявить его в расширении.
Вот мое понимание:
Extensions обычно используются, чтобы добавить дополнительные функции нашего собственного «пользовательского класса». Мы можем добавить частные методы или свойства, расширяющие интерфейс класса, которые могут использоваться в реализации класса.
Расширения должны быть записаны в том же файле, что и класс. Следовательно, вы не можете писать расширения для предварительно определенных типов, таких как String, Float и т. Д.
С другой стороны, категории могут использоваться для добавления дополнительных методов для существующих классов. Например, мы можем создавать собственные методы, расширяя класс String. Учтите, что мы не можем создавать дополнительные свойства в категориях. Также главное преимущество категорий - мы можем писать категории в любом другом файле, за пределами файла, в котором заканчивается ваш класс.
Также при создании категорий вы должны указывать имя в скобках. Но для расширения имени не требуется. Поэтому несколько раз их также называют анонимными категориями.
Расширение: Для того, чтобы сделать методы приватным и добавить свойства нашего собственного пользовательского класса не из класса яблочного
Категория: - Для того, чтобы добавить больше методов в существующем классе не свойство, она может быть использована для как пользовательский класс, так и класс Apple, такой как NSString
- 1. В чем разница между наследованием и категорией
- 2. Цель C - Разница между реализацией и расширением
- 3. Разница между «расширением приложения» и sharedPreferences?
- 4. Grails: В чем разница между расширением и внедрением класса домена?
- 5. Разница между расширением программирования и API
- 6. Разница между угловым и угловым расширением?
- 7. Fortran: разница между f и F-расширением
- 8. Python: разница между добавлением и расширением
- 9. Разница между расширением и сужением в C++?
- 10. В чем разница между категорией словаря и таксономией?
- 11. В чем разница между таксономией, категорией и тегом в wordpress?
- 12. Разница между методом swizzling и категорией в Objective c
- 13. В чем разница между импортом и расширением в java?
- 14. В чем разница между категорией/category_id/item_id и категорией? Category_id = {} & item_id = {} в REST?
- 15. В чем разница между включением и расширением в Ruby?
- 16. разница между переменной класса и атрибутом класса
- 17. Разница между идентификатором класса и экземпляром класса
- 18. Разница между объявлением класса
- 19. разница между декларациями класса
- 20. MYSQL Между категорией
- 21. В чем разница между простым классом es6 и расширением React.Component
- 22. в AngularJS, в чем разница между наследованием и расширением?
- 23. В чем разница между расширением YAML и YML?
- 24. В чем разница между упакованным и распакованным расширением Google Chrome?
- 25. В чем разница между расширением браузера и объектом помощника браузера
- 26. Разница между `util.inherits` и расширением прототипа в NodeJS
- 27. В чем разница между внедрением Serializable и расширением Serializable?
- 28. разница между расширением связывания и привязки в wcf
- 29. В чем разница между расширением Firefox и плагином?
- 30. В чем разница между расширением magento и отдыхом api?
http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20 -SW1 – Akusete
Akusete, страница не найдена. –
ясно иллюстрируется здесь, http://code.tutsplus.com/tutorials/objective-c-succinctly-categories-and-extensions--mobile-22016 –