類簇 | 公共抽象父類 |
---|---|
NSNumber | NSNumber |
NSData | NSData NSMutableData |
NSArray | NSArray NSMutableArray |
NSDictionary | NSDictionary NSMutableDictionary |
NSString | NSString NSMutableString |
定義
類簇就是定義相同的接口并提供相同功能的一組類的集合袖扛。僅公開接口的抽象類也稱為公共類申窘。類簇是Foundation framework框架下的一種設(shè)計模式弯蚜,它管理了一組隱藏在公共接口下的私有類。
拿NSString
來舉例子偶洋,NSString *str = @"this is a const String"
,使用上述這種方式聲明并創(chuàng)建str
變量時熟吏,str
變量的類型并不是NSString
,而是__NSCFConstantString
玄窝。詳細內(nèi)容參考下面的代碼演示:
// Created by zhen7216 on 2018/1/19.
// Copyright ? 2018年 ChenZhen. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <stdio.h>
static void printClass(NSString *obj) {
// isMemberOfClass:只能確定一個對象是否是當前類的成員牵寺,
// isKindOfClass:來確定一個對象是否是一個類的成員,或者是派生自該類的成員
printf("Class=%s, /t Member= %s,\tKind=%s\n",
[NSStringFromClass([obj class]) UTF8String],
[obj isMemberOfClass:[NSString class]] ? "Yes" : "NO",
[obj isKindOfClass:[NSString class]] ? "Yes" : "No");
}
int main(int argc, const char * argv[]) {
NSString *ss = @"static string";
@autoreleasepool {
printClass(ss);
printClass([ss stringByAppendingString:@"(^-^)"]);
printClass([NSString stringWithUTF8String:"---"]);
printClass(NSHomeDirectory());
}
return 0;
}
屏幕快照 2018-01-19 上午11.09.08.png
通過演示可以看出恩脂,通過抽象類NSString
生成的實例變量帽氓,其類型并不是它本身,而是在其內(nèi)部定義的子類俩块,也稱為私有子類黎休。類簇有一個機制,可以從多個已存在的類中挑選出最適合當前場景的類并自動啟用玉凯,比如上面的例子中通過不同的構(gòu)造方式生成不同的子類势腮。
生成子類
公共類作為抽象類被實現(xiàn)時,各個方法是在私有子類中具體實現(xiàn)的漫仆。所以捎拯,實現(xiàn)抽象類的子類并沒什么意義。(ps:當一個抽象類定義一個子類時盲厌,比如給NSString
定義一個Son子類署照,那么調(diào)用[Son stringWithUTF8String:"d"]
的時候會發(fā)生崩潰,不能識別的selector吗浩,見下圖)可以使用范疇(Category)和關(guān)聯(lián)引用的功能對其進行擴展建芙。在公共類中添加的范疇也會被類簇中隱藏的子類所繼承,類簇中所有的子類都可以使用新添加的功能懂扼。
屏幕快照 2018-01-19 下午3.06.10.png
屏幕快照 2018-01-19 下午3.07.28.png