Расширения класса @interface Class ()
намного более мощные и могут вводить переменные в класс. Категории @interface Class (Category)
не могут.
Какие еще существуют различия, и когда следует использовать категорию над расширением класса?
Расширения класса @interface Class ()
намного более мощные и могут вводить переменные в класс. Категории @interface Class (Category)
не могут.
Какие еще существуют различия, и когда следует использовать категорию над расширением класса?
Основное отличие состоит в том, что с расширением компилятор ожидает, что вы реализуете методы в своем основном @implementation
, тогда как в категории у вас есть отдельный блок @implementation
. Таким образом, вы должны использовать только расширение в верхней части основного файла .m
(единственное место, где вам нужно заботиться об иварах, кстати) - это значит, что это просто расширение.
Расширение класса имеет некоторое сходство с категорией, но оно может быть добавлено только в класс, для которого у вас есть исходный код во время компиляции (класс скомпилирован одновременно с расширением класса). Методы, объявленные расширением класса, реализованы в блоке @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 не является обязательным, поскольку его значение по умолчанию. Вы можете использовать его при обновлении свойства для ясности.
Категории - это функция языка Objective-C, которая позволяет добавлять новые методы в существующий класс. Расширения являются особым случаем категорий, которые позволяют определять методы, которые должны быть реализованы в основном блоке реализации.
Частные объявления могут быть в расширениях классов, которые в основном являются некоторыми свойствами, потому что нам не нужно объявлять метод до того, как мы его назовем.
расширение ios, похожее на С#, абстрактный класс Java или интерфейс
ios, аналогичная расширению класса С#
Категории - это способ расширения API существующих классов, а расширения - способ добавления необходимых методов к API за пределами основного файла интерфейса. Оба они были первоначально разработаны для облегчения бремени поддержки больших кодовых баз.
Предостережения использования категории:
1- Вы не можете надежно переопределить методы, определенные в категориях для одного и того же класса.
2- Категория не может добавлять переменные экземпляра. Это означает, что вы не можете объявлять новые свойства.
Ссылка: Objective-C Кратко: категории и расширения. Он подробно обсуждает примеры.