Расширение класса и категория класса

Расширения класса @interface Class () намного более мощные и могут вводить переменные в класс. Категории @interface Class (Category) не могут.

Какие еще существуют различия, и когда следует использовать категорию над расширением класса?

Ответ 1

Основное отличие состоит в том, что с расширением компилятор ожидает, что вы реализуете методы в своем основном @implementation, тогда как в категории у вас есть отдельный блок @implementation. Таким образом, вы должны использовать только расширение в верхней части основного файла .m (единственное место, где вам нужно заботиться об иварах, кстати) - это значит, что это просто расширение.

Ответ 2

Расширение класса имеет некоторое сходство с категорией, но оно может быть добавлено только в класс, для которого у вас есть исходный код во время компиляции (класс скомпилирован одновременно с расширением класса). Методы, объявленные расширением класса, реализованы в блоке @implementation для исходного класса, поэтому вы не можете объявить расширение класса в классе фреймворка, например класс Cocoa или Cocoa Touch, такой как NSString.

Синтаксис объявления расширения класса аналогичен синтаксису для категории и выглядит следующим образом:

@interface ClassName ()
@end

Поскольку в круглых скобках не указывается имя, расширения класса часто называются анонимными категориями.

В отличие от обычных категорий расширение класса может добавлять в класс собственные свойства и переменные экземпляра. Если вы объявляете свойство в расширении класса, например:

@interface XYZAnimal () {
    id _someCustomInstanceVariable;
}
...
@end

IMHO, лучше подумать о расширениях классов как о частном интерфейсе для класса. Основной интерфейс (в вашем .h файле) действует как открытый интерфейс, который определяет классовый поведенческий контракт с другими классами.

Используйте расширения классов для скрытия частной информации

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

В качестве примера класс XYZPerson может добавить свойство, называемое uniqueIdentifier, предназначенное для отслеживания информации, например, номера социального страхования в США.

Обычно требуется большой объем документов, чтобы иметь уникальный идентификатор, назначенный человеку в реальном мире, поэтому интерфейс класса XYZPerson может объявить это свойство как только для чтения и предоставить некоторый метод, который запрашивает идентификатор, например

@interface XYZPerson : NSObject
    ...
    @property (readonly) NSString *uniqueIdentifier;
    - (void)assignUniqueIdentifier;
@end

Чтобы класс XYZPerson мог изменять свойство внутри, имеет смысл переопределить свойство в расширении класса, которое определено в верхней части файла реализации для класса:

@property (readwrite) NSString *uniqueIdentifier;

Примечание. Атрибут readwrite не является обязательным, поскольку его значение по умолчанию. Вы можете использовать его при обновлении свойства для ясности.

Ответ 3

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

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

Ответ 4

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

ios, аналогичная расширению класса С#

Ответ 5

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

Предостережения использования категории:

1- Вы не можете надежно переопределить методы, определенные в категориях для одного и того же класса.

2- Категория не может добавлять переменные экземпляра. Это означает, что вы не можете объявлять новые свойства.

Ссылка: Objective-C Кратко: категории и расширения. Он подробно обсуждает примеры.