iOS开发-类簇(Class Cluster)
类簇(Class Cluster)是定义相同的接口并提供相同功能的一组类的集合,仅公开接口的抽象类也可以称之为类簇的公共类,每个具体类的接口有公共类的接口抽象化,并隐藏在簇的内部。这些类一般不能够直接使用,一般都是由公共类的子类来实现,可以称之为私有子类。看概念会觉得有点枯燥,其实最常用的NSString就是一个类簇,不过看起来不明显,比较明显的是NSNumber,numberWithInt,numberWithDouble,这些方法其实在调用NSNumber的时候父类实例化私有子类,返回对应的实例。
基础概念
概念一般都是比较枯燥一点,我们可以先写一个简单的测试小程序来看一下NSString类簇大概的样子:
NSString *result=@"博客园-FlyElephant";
classClusterLog(result);
classClusterLog([result stringByAppendingString:@"原文地址:http://www.cnblogs.com/xiaofeixiang/"]);
classClusterLog([NSString stringWithUTF8String:"---"]);
classClusterLog(NSHomeDirectory());
输出方法:
static void classClusterLog(NSString *str){
NSLog(@"Content=%@,Class=%s,\tmember=%s,\tkind=%s\n",
str,
[NSStringFromClass([str class]) UTF8String],
[str isMemberOfClass:[NSString class]]?"Yes":"NO",
[str isKindOfClass:[NSString class]]?"YES":"NO");
}
测试结果:

通过Log我们输出了类的真实的类型,我们发现每个类的类型都不一样,而且我们MemberClass得到的是类簇的类型,KindClass才能得到子类的类型,很多情况下公共类作为抽象类被实现的时候,各个方法都是在子类中具体实现的,因此即使直接生成继承公共类的子类,也不能立即产生用户想要的功能。
类簇的子类
类簇是多种类别实现抽象化,在公共类的外部只有类簇是可见的,虽然类簇是作为Foundation框架的基本类实现,一般情况下没必要生成子类,不过有的时候类簇的基本方法方法不能满足基本需求的时候可以使用Category进行扩展,这个之前的文章中有过讲述,如果不是很清晰,可以查看一下。类簇包含了基本的方法,但是具体的实现都是在私有子类中。如果我们需要新生成子类,可以直接实现已经公开的基本方法。
NSString有两个基本的方法:length和characterAtIndex,我们定义个NSString子类看一下效果:
@interface BitPattern : NSString
{
unsigned char value;
} -(id)initWithChar:(char)val; -(NSUInteger)length; -(unichar)characterAtIndex:(NSUInteger)index; @end
实现文件:
@implementation BitPattern
-(id)initWithChar:(char)val{
self=[super init];
if (self) {
value=val;
}
return self;
}
-(NSUInteger)length{
return 4;
}
-(unichar)characterAtIndex:(NSUInteger)index{
return 'K';
}
@end
简单调用:
NSString *bits;
bits=[[BitPattern alloc]initWithChar:'A'];
NSLog(@"%@--结果为:%s",[bits class],[bits UTF8String]);
最后的结果为KKKK,关于类簇的子类的实现方法有几个需要考虑的地方:
1.确定私有数据结构,作为超类不能使用所有的数据结构;
2.定义初始化方法,定义init..这样的初始化方法,不能继承和使用init之外的超类的初始化方法;
3.定义构造器,不能继承和使用超类的同样的方法;
4.定义基本方法
5.定义其他方法,通过定义基础方法,公共类声明的方法可以暂且执行,但是利益哦那个生成的数据结构的特征也许能够产生更加高效的方法;
iOS中的类簇也可以理解为简单工厂设计模式的一种具体实现~
iOS开发-类簇(Class Cluster)的更多相关文章
- iOS - 类簇
类簇是在Objective-C中Foundation Framework中广泛使用的一种设计模式 1.发现类簇(Class Cluster)的踪迹 //*> 执行下面代码 id obj1 = [ ...
- 《iOS开发全然上手——使用iOS 7和Xcode 5开发移动与平板应用》之Objective-C新手训练营
编写Hello World应用程序通常被觉得,是学习不论什么编程语言的第一步.在这一章,你将创建iOS版的Hello World应用程序作为起步,高速了解Xcode这个开发iOS应用程序的主要工具. ...
- iOS开发笔记系列-基础2(类)
面向对象编程总是离不开类和对象的,Objective-C也不例外,不过Objective-C中的类还有一些自己的独特点. 类的声明和定义 在iOS开发中,类的声明与定义通常都是分开的,类得声明通常存放 ...
- iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值
在上篇博客<iOS开发之使用Runtime给Model类赋值>中介绍了如何使用运行时在实体类的基类中添加给实体类的属性赋值的方法,这个方法的前提是字典的Key必须和实体类的Property ...
- iOS开发之使用Runtime给Model类赋值
本篇博客算是给网络缓存打个基础吧,本篇博客先给出简单也是最容易使用的把字典转成实体类的方法,然后在给出如何使用Runtime来给Model实体类赋值.本篇博客会介绍一部分,主要是字典的key与Mode ...
- iOS开发拓展篇—封装音频文件播放工具类
iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...
- 谈谈iOS开发如何写个人中心这类页面--静态tableView页面的编写
本文来自 网易云社区 . 一.本文讲的是什么问题? 在开发 iOS 应用时,基本都会遇到个人中心.设置.详情信息等页面,这里截取了某应用的详情编辑页面和个人中心页面,如下: 我们以页面结构的角度考虑这 ...
- iOS之NSArray类簇简介-(copy、mutableCopy导致程序crash)
1.前言 开发时常常用数组对数据进行处理,对NSMutableArray进行操作时经常导致程序崩溃,特研究一下NSArray的类簇!涉及__NSPlaceholderArray.__NSArray0. ...
- IOS 杂笔-1(为什么不继承类簇?)
答:首先,类簇是可以继承的,并不是不可以.例如,我们可以选择继承NSSting,但是此时你用你自己设定的类去调用NSSting的一些方法时,会存在无法实现的问题,这是为什么呢. 1.类簇里有很多私有的 ...
随机推荐
- UVALive 7146 (贪心+少许数据结构基础)2014acm/icpc区域赛上海站
这是2014年上海区域赛的一道水题.请原谅我现在才发出来,因为我是在太懒了.当然,主要原因是我刚刚做出来. 其实去年我就已经看到这道题了,因为我参加的就是那一场.但是当时我们爆零,伤心的我就再也没有看 ...
- 【Codechef-Hard】Chef and Churu 分块
题目链接: https://www.codechef.com/problems/FNCS Solution 大力分块.. 对序列分块,维护块内前缀和.块的前缀和,修改时暴力维护两个前缀和,询问单点答案 ...
- HDU 5840 This world need more Zhu 树链剖分+暴力
This world need more Zhu 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5840 Description As we all ...
- 接口开发-集成接口文档(swagger)
在正式进入主题之前,先说说实际工作中遇到的问题.不算是传统的原生APP开发,还是眼下的H5混合开发,只要是需要前后端通过接口配合的,往往都存在几个普遍的问题 (1)接口文档谁来写,尤其是跨部门,并且, ...
- HDU 4818 Golden Radio Base (2013长春现场赛B题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4814 进制转换. 现场根据题目给的两个公式,不断更新!!! 胡搞就可以了. 现场3A,我艹,一次循环开 ...
- 打印函数 lodop
Lodop属性和方法详解 例子:LODOP.PRINT_INIT("打印任务名");LODOP.SET_PRINT_COPIES(2);bdhtml=window.document ...
- BTrace housemd TProfiler
http://blog.csdn.net/y461517142/article/details/26269529 http://calvin1978.blogcn.com/articles/btrac ...
- 任务失败,因为未找到“AxImpexe”,或未安装正确的 Microsoft Windows SDK
jenkins自动构建.net时发生错误,查看Console Output看到如下错误: C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft ...
- 比Wireshark更轻量、更方便的抓包软件:Charles
转:http://blog.csdn.net/lixing333/article/details/42776187 之前写过一篇通过Wireshark进行抓包,分析网络连接的文章<通过WireS ...
- iOS 程序插件及功能动态更新思路
所用框架及语言 iOS客户端-Wax(开发愤怒的小鸟的连接Lua 和 Objc的框架),Lua,Objc, 服务端-Java(用于返回插件页面) 工具框架链接地址:Wax - https://gith ...