我在读NSArray就是这样。听起来很沉重。我的办公桌上有7本关于Objective-C,Cocoa和C的真书。它们都没有提到类集群,至少在书的后面的索引中找不到。那是什么
我在读NSArray就是这样。听起来很沉重。我的办公桌上有7本关于Objective-C,Cocoa和C的真书。它们都没有提到类集群,至少在书的后面的索引中找不到。那是什么
Answers:
从苹果公司的文档......。简而言之,这是Foundation框架中使用的设计模式,这可能就是为什么ObjC书籍中未提及它的原因。
类集群是一种将公共的抽象超类下的多个私有的具体子类分组的体系结构。以这种方式对类进行分组为用户提供了简化的界面,该用户仅看到公开可见的体系结构。
我不知道Steve所引用的CDP中有什么内容,但基本上,Objective-C类集群是一种支持实现抽象Factory模式的构造。
这个想法很简单:您想要提供一个Factory(集群)接口,该接口以最少的描述制造并返回一个Factory对象的特定具体实例,该实例满足Factory(集群)接口描述的集群家族的行为。
一个简单的具体示例:该示例提供一个Laugh工厂,该工厂产生特定笑声类型(例如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
方法中释放self 并返回其他东西有多安全?有苹果公司提供的代码示例吗?(2)另外,您大概正在使用代码创建实例,例如[[Laugh alloc] initWithLaughter:kLaughWithGiggle]
。注意如何Laugh
分配不必要的,因为它将在此调用后立即释放。当您可以创建这样的类方法时,为什么要这样做呢?它可以[Laugh laughWithLaughter:kLaughWithGiggle]
为您提供私有子类的所有优点,同时又避免了上面的问题1和2?
+alloc
返回实现各种-initWith:
方法的单例工厂类。-initWith:
然后,如果需要,则工厂类的方法负责根据给定的方法参数分配和初始化具体的子类,或者在某些情况下可能根本不分配任何内容(例如-[NSString initWithString:]
)。您可以通过返回值检查试试吧+[NSString alloc]
,+[NSArray alloc]
等
类群集为一组具体的私有子类实现提供单个公共接口。一个Objective-C程序员经常使用类集群,而很少意识到它-这就是类集群的全部要点。类集群的工作是将实现细节的复杂性隐藏在公共接口的后面。
许多Foundation类都是类簇,例如NSString,NSArray,NSDictionary和NSNumber。当您调用[NSString stringWithFormat:]
类集群时,将为您提供一些实现该NSString
接口的具体类。它可以是一个NSConcreteString
,NSCFString
,NSFooBarString
,等哪一个类簇为您提供了基于构造函数或初始化程序您调用和参数。
因此,类集群是Objective-C编程中最强大的概念之一。
如果您来自其他语言,则可能熟悉“四人帮”模式。类群集具有抽象工厂和外观模式的元素。
Apple的公共文档非常广泛地介绍了类集群(以及如何实现和扩展它们)。不幸的是,我发现对于许多iOS开发人员而言,此模式和其他可可特定模式都是盲点。
NSArray类集群不是“重量级”的,它是一种使用数组类的任意数量的实现的方式,而您的代码无需了解或关心特定的实现。在后台,有一些适用于不同用例的NSArray具体子类,例如大型稀疏数组或包含在编译时已知的特定数量元素的数组。
NSArray,NSString和NSNumber是您最常遇到的类集群。
[myArray isKindOfClass:[NSMutableArray class]]
即使它不应该返回YES?