Я читав, що NSArray - це просто така річ. Звучить важко. На моєму столі у мене 7 справді товстих книжок про Objective-C, Cocoa та C. Жодна з них взагалі не згадує кластер класів, принаймні, я не можу знайти його в Індексі на кінці книг. То що це?
Я читав, що NSArray - це просто така річ. Звучить важко. На моєму столі у мене 7 справді товстих книжок про Objective-C, Cocoa та C. Жодна з них взагалі не згадує кластер класів, принаймні, я не можу знайти його в Індексі на кінці книг. То що це?
Відповіді:
З документації Apple, ... . Коротше кажучи, це шаблон дизайну, що використовується в рамках Foundation, і, мабуть, саме тому він не згадується в книгах ObjC.
Кластер класів - це архітектура, яка групує низку приватних конкретних підкласів під загальнодоступним абстрактним суперкласом. Групування класів таким чином забезпечує спрощений інтерфейс для користувача, який бачить лише загальнодоступну архітектуру.
Я не знаю, що є в CDP, на який посилався Стів, але в основному кластер класу Objective-C - це конструкція, яка підтримує реалізацію абстрактного шаблону Factory .
Ідея проста : Ви хочете , щоб забезпечити завод (кластер) інтерфейс, з мінімальним описом, виробляє і повертають певний конкретний екземпляр об'єкта Factory , який задовольняє поведінка сімейства кластерів , описане інтерфейс Factory (Cluster).
Простий конкретний приклад : Цей приклад пропонує фабрику Laugh, яка виробляє конкретні класи конкретних типів сміху (наприклад, Guffaw, Giggle). Зверніть увагу на метод Laugh initWithLaughter:.
На сміх. H:
#define kLaughWithGuffaw 1
#define kLaughWithGiggle 2
@interface Laugh: NSObject {}
- (Laugh *) initWithLaughter:(NSUInteger) laughterType;
- (void) laugh;
@end
У сміху:
@interface Guffaws:Laugh {}
- (void) laugh;
@end
@interface Giggles:Laugh {}
- (void) laugh;
@end
@implementation Laugh
- (Laugh *) initWithLaughter:(NSUInteger) laugherType {
id instanceReturn=nil;
; // Removed for ARC [self release]
if ( laughterType == kLaughWithGuffaw )
instanceReturn = [[Guffaws alloc]init];
else if( laughterType == kLaughWithGiggle )
instanceReturn = [[Giggles alloc]init];
else
; // deal with this
return instanceReturn;
}
- (void) laugh {
NSLog(@"Humbug");
}
@end
@implementation Guffaws
- (void) laugh {
NSLog(@"OH HA HA HOWAH HA HA HA");
}
@end
@implementation Giggles
- (void) laugh {
NSLog(@"Tee hee");
}
@end
.m-file
.
init
методі і повернути щось інше? Чи є приклади коду від Apple, де вони це роблять? (2) Крім того, ви, мабуть, створюєте примірник з кодом, таким як [[Laugh alloc] initWithLaughter:kLaughWithGiggle]
. Зверніть увагу, як Laugh
розподіляється без потреби, оскільки він буде випущений відразу після цього дзвінка. Навіщо це робити так, коли ви можете створити метод класу, такий як той, [Laugh laughWithLaughter:kLaughWithGiggle]
який надає вам усі переваги приватних підкласів, уникаючи при цьому вищезазначених питань 1 і 2?
+alloc
повертає фабричний клас-синглтон, який реалізує різні -initWith:
методи. Тоді -initWith:
методи заводського класу відповідають за виділення та ініціалізацію конкретного підкласу на основі заданих параметрів методу, якщо це необхідно, або в деяких випадках можуть взагалі нічого не виділяти (наприклад -[NSString initWithString:]
). Ви можете спробувати його, перевіряючи на яке значення +[NSString alloc]
, +[NSArray alloc]
і т.д.
З програмування в цілі с Стівена Кочана на сторінці 498 у глосарії, кластер:
Абстрактний клас, який групує набір приватних конкретних підкласів, забезпечуючи спрощений інтерфейс для користувача через абстрактний клас.
Кластери класів забезпечують єдиний загальнодоступний інтерфейс для групи конкретних реалізацій приватного підкласу. Програміст-c використовує кластери класів часто і рідко усвідомлює це - і в цьому вся суть кластера класів. Завдання кластера класів - приховувати складність деталей реалізації за загальнодоступним інтерфейсом.
Багато класів Foundation - це кластери класів, такі як NSString, NSArray, NSDictionary та NSNumber. Коли ви викликаєте [NSString stringWithFormat:]
кластер, кластер дає вам конкретний клас, який реалізує NSString
інтерфейс. Це може бути NSConcreteString
, NSCFString
,NSFooBarString
і т.д. Який клас кластер дає на основі конструктора або ініціалізатор ви дзвоните і аргументи.
Через це кластери класів є однією з найбільш розширених концепцій програмування Objective-C.
Якщо ви походите з інших мов, вам може бути знайома модель "Банда чотирьох". Кластери класів мають елементи як абстрактної фабрики, так і фасадів.
Публічна документація Apple досить широко охоплює кластери класів (і способи їх впровадження та розширення). На жаль, я виявив, що для багатьох розробників iOS ця та інші специфічні для какао моделі є сліпою зоною.
Основні компетенції какао: Кластер класів
Посібник з основ какао: Кластери класів
Приклади реалізації власних кластерів класів доступні на GitHub
Кластер класів NSArray не є "важким", це спосіб для використання будь-якої кількості реалізацій класу масиву, без того, щоб ваш код знав чи турбувався про конкретну реалізацію. Під капотом є конкретні підкласи NSArray, які підходять для різних випадків використання, такі як великі, розріджені масиви або масиви, що містять певну кількість елементів, відомих під час компіляції.
NSArray, NSString та NSNumber - це кластери класів, з якими ви найчастіше стикаєтесь.
[myArray isKindOfClass:[NSMutableArray class]]
повернули б ТАК, хоча це не повинно?