2010-08-17 2 views
75

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

+0

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20 -SW1 – Akusete

+3

Akusete, страница не найдена. –

+0

ясно иллюстрируется здесь, http://code.tutsplus.com/tutorials/objective-c-succinctly-categories-and-extensions--mobile-22016 –

ответ

92

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

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

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

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

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

+0

Большое вам спасибо. – Abhinav

+13

В Class-Extensiosn вы можете переписать свойства из (общедоступного) свойства только для чтения, чтобы быть внутренне readwrite. И поскольку LLVM 1.5 вы можете сделать еще больше: теперь вы можете объявить переменные экземпляра в расширении класса, чтобы они исчезли из обычного интерфейса. –

+0

Зачем добавлять расширение класса, когда вы могли бы просто реализовать эти методы и свойства в классе? Кажется немного лишним для меня. – user1721803

1
@interface SomeClass() 


- (void) anAdditionalMethod; 


@end 

Я думаю, что это не способ объявить категорию. Категория должен иметь имя

@interface SomeClass (XYZ) 


- (void) anAdditionalMethod; 


@end 

, например

@interface NSMutableArray (NSMutableArrayCreation) 

+ (id)arrayWithCapacity:(NSUInteger)numItems; 
- (id)initWithCapacity:(NSUInteger)numItems; 

@end 

Заявленный для NSMutableArray Яблоком

+0

Вот как вы объявляете и расширяете, а не категорию -> @interface SomeClass() – ChavirA

35
  1. категории

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

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

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

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

    -> В Objective C, если вы хотите, чтобы сделать поведение некоторых свойств частного использовать расширение класса.

    -> он поставляется только с файлом .m.

    -> главным образом для объектов.

Примечание: при добавлении нового файла и выберите опцию Objective C категории это показать категорию и «категории на» не «подкласс» так показать, как

@interface className (categoryName) 
@end 

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

и удлинительной случае вы получаете

@interface className() 
@end 

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

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

@Prasanna: расширение класса поставляется только с файлом .m, но не в .h – Saggy

+0

@Saggy thsks для исправления –

3

У нас также могут быть свойства Использование свойства 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/

0

Категории

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

Расширения

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

Дополнительная информация по телефону this ссылка

1

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

+3

ваш ответ так же, как «Кошка похожа на тигра, отвечающего на слепого». Lol –

+1

на самом деле. Это самое прямое и быстрое объяснение, если вы знаете C# или java. – Add080bbA

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

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

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

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

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

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

+2

Я прочитал 5 похожих вопросов со многими ответами, и это лучшее. Спасибо! – Honey

+0

Это очень ясно –

+0

Хорошо объяснено. – Ishu

0

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

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

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

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

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

0

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

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

Смежные вопросы