Я читал, что NSArray - это именно такая вещь. Звучит тяжело. У меня на столе есть 7 действительно толстых книг о Objective-C, Cocoa и C. Ни в одной из них не упоминается кластер классов, по крайней мере, я не могу найти его в указателе в конце книг. Так что это?
91
Ответы:
Из документации Apple, ... . Короче говоря, это шаблон проектирования, используемый во фреймворке Foundation, и, вероятно, поэтому он не упоминается в книгах по ObjC.
источник
Я не знаю, что находится в CDP, на который ссылается Стив, но в основном кластер классов Objective-C - это конструкция, которая поддерживает реализацию абстрактного шаблона Factory .
Идея проста : Вы хотите , чтобы обеспечить завод (кластер) интерфейс, с минимальным описанием, производит и возвращают определенный конкретный экземпляр объекта Factory , который удовлетворяет поведение семейства кластеров , описанное интерфейс Factory (Cluster).
Простой конкретный пример : этот пример предоставляет фабрику смеха, которая производит конкретные классы определенных типов смеха (например, Guffaw, Giggle). Обратите внимание на метод Laugh initWithLaughter : .
В Laugh.h:
#define kLaughWithGuffaw 1 #define kLaughWithGiggle 2 @interface Laugh: NSObject {} - (Laugh *) initWithLaughter:(NSUInteger) laughterType; - (void) laugh; @end
В Laugh.m:
@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]
и т.д.Из программирования в цели c Стивена Кочана на странице 498 в глоссарии, кластер:
источник
Кластеры классов предоставляют единый открытый интерфейс для группы конкретных частных реализаций подклассов. Программист на Objective-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]]
вернет YES, даже если не должно?