У чому різниця між категорією та розширенням класу. Я вважаю, що обидва використовуються для додавання власних методів у існуючі класи. Хтось може пролити на це світло? Пояснення з кодом буде дуже вдячне.
У чому різниця між категорією та розширенням класу. Я вважаю, що обидва використовуються для додавання власних методів у існуючі класи. Хтось може пролити на це світло? Пояснення з кодом буде дуже вдячне.
Відповіді:
Категорія - це спосіб додавання методів до існуючих класів. Зазвичай вони містяться у файлах "Class + CategoryName.h", наприклад "NSView + CustomAdditions.h" (і .m, звичайно).
Розширення класу - це категорія, за винятком 2 основних відмінностей:
Категорія не має назви. Це оголошено так:
@interface SomeClass ()
- (void) anAdditionalMethod;
@end
Реалізація розширення повинна знаходитися в основному блоці @implementation файлу.
Досить часто можна побачити розширення класу у верхній частині файлу .m, що декларує більше методів у класі, які потім реалізуються нижче в головному розділі @implementation класу. Це спосіб оголосити "псевдоприватні" методи (псевдоприватні в тому, що вони насправді не приватні, а не зовнішні).
=> У цілі C, коли ви хочете додати ще деяку функціональність до класу без успадкування, ви просто використовуєте категорію для нього.
=> він поставляється зі своїми .h та .m файлом
=> Category
використовує для додавання нового методу, а не властивостей.
-> In Objective C, when you want to make behaviour of some property private you use class extension.
-> it comes with **.h** file only.
-> mainly for properties.
Примітка: коли ми додаємо новий файл і вибираємо варіант цілі, категорія c відображає категорію та "категорію", а не "підклас", щоб вона відображала як
@interface className (categoryName)
@end
-Ви отримаєте два файли .h та .m з іменем файлу як ( className + categoryName.h та className + categoryName.m )
а у випадку продовження ви отримаєте
@interface className()
@end
-Ви отримаєте лише один файл із назвою className_extensionName.h
Категорія - це спосіб додавання методів до класу, доступний чи ні вихідний код, тобто ви можете додавати категорію до базових класів, наприклад NSString
а також до власних користувацьких класів.
Розширення можна додавати лише до класів, вихідний код яких доступний, оскільки компілятор компілює вихідний код та розширення одночасно.
Ми можемо додавати змінні та властивості додаткового екземпляра в розширення класу, але не в категорію.
Будь-яка змінна та метод всередині розширення навіть недоступні для успадкованих класів.
Категорія та розширення в основному створені для обробки великої бази коду, але категорія - це спосіб розширення API класу в декількох вихідних файлах, тоді як розширення - це спосіб додавання необхідних методів за межами основного файлу інтерфейсу.
Використовуйте категорію, коли вам потрібно розбити один і той самий код класу на різні вихідні файли відповідно до різних функціональних можливостей, і розширення, коли вам просто потрібно додати деякі необхідні методи до існуючого класу за межами основного файлу інтерфейсу. Крім того, коли вам потрібно змінити загальнодоступну змінну екземпляра в класі, наприклад, readonly для читання, ви можете повторно оголосити її в розширенні.
Розширення : зробити методи приватними та додати властивості нашого власного класу, а не класу Apple.
Категорія : Щоб додати більше методів до існуючого класу, а не властивості, його можна використовувати як для власного класу, так і для класу Apple NSString
.
Ми також можемо мати властивості, використовуючи властивість, пов’язану з набором, у класі категорії.
@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
розширення ios подібне до c #, абстрактний клас Java або інтерфейс
ios категорія подібне до c #, розширення класу java
Категорії
Категорії використовуються, коли ви створюєте файл, що містить велику кількість методів, тому вони надають вам можливість розбити один клас на різні модулі. Крім того, якщо в категорії вносяться якісь зміни, компілятор не витрачає час на компіляцію всього проекту .Категорії не можуть додавати нову змінну або властивості і шукати їх батьківський клас. Ви можете замінити метод у категорії, але це не є гарною ідеєю, оскільки метод не може бути перевизначений. Також потік може бути здійснений, оскільки всі категорії мають під час виконання можуть існувати однаковий ієрархічний рівень, а отже, дві категорії, що належать до одного батьківського класу. Також захищені методи можна створити за допомогою категорій
Розширення
Розширення дозволяють замінити властивість або додати нову властивість до існуючого батьківського класу. Синтатично те саме до категорій, у яких вони не мають імені та представлені як клас @interface () Файл .m відсутній, а метод, оголошений у розширенні, повинен бути реалізований у @ реалізації батьківського файлу
Більше довідки за цим посиланням
Ось моє розуміння:
Розширення зазвичай використовуються для додавання додаткових функцій до нашого власного " користувацького класу ". Ми можемо додати приватні методи або властивості, що розширюють інтерфейс класу, які можуть бути використані в рамках реалізації класу.
Розширення слід писати в тому ж файлі, що і клас. Отже, ви не можете писати розширення для попередньо визначених типів, таких як String, Float тощо.
З іншого боку, категорії можна використовувати для додавання додаткових методів до вже існуючих класів. Наприклад, ми можемо створити власні методи, розширивши клас String. Зверніть увагу, що ми не можемо створити додаткові властивості в категоріях. Також головною перевагою категорій є те, що ми можемо писати категорії в будь-який інший файл, за межами файлу, з якого виходить ваш клас.
Також під час створення категорій ви повинні дати їм назву в дужках. Але для розширення ім'я не потрібно. Тому іноді їх також називають анонімними категоріями.