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.类簇里有很多私有的 ...
随机推荐
- html5解决ajax破坏浏览器机制
pjax是一种基于ajax+history.pushState的新技术,该技术可以无刷新改变页面的内容,并且可以改变页面的URL.pjax是ajax+pushState的封装,同时支持本地存储.动画等 ...
- django权限管理
当我们为应用创建一个Models, 在同步到数据库里,django默认给了三个权限 ,就是 add, change, delete权限. 首先,我们创建一个perm_test的project, 然后再 ...
- 每日踩坑 2018-01-09 WebAPI会如何面对URL中的空串string参数?
这个问题是我的同事问我的,可能有点 low 哈. 同事审查我的代码,表示应该对 URL 中的 string 参数进行一个空验证. 我倾向于认为,会无法匹配到路由方法. 然后我就写了一个Test, [H ...
- react比较入门的小demo
什么是jsx? JSX是JavaScript XML 这两个单词的缩写,xml和html非常类似,简单来说可以把它理解成使用各种各样的标签,大家可以自行 百度.所以jsx就是在javascri ...
- vue项目开发之v-for列表渲染的坑
不知道大家在用vue开发的过程中有没有遇到过在使用v-for的时候会出现大片的黄色警告,比如下图: 其实这是因为没有写key的原因 :key是为vue的响应式渲染提供方法,在列表中单条数据改变的情况下 ...
- 使用 IntraWeb (22) - 基本控件之 TIWCalendar
TIWCalendar: 日历控件, 继承于 TIWCustomGrid, 所以它和 TIWGrid 共同属性特多. 它的 Cell 是 TIWCalendarCell 对象, 直接从 TIWGrid ...
- css卷叶效果
<!DOCTYPE HTML><html lang="en-US"><head> <meta charset="UTF-8&qu ...
- 20款最好的免费 Bootstrap 后台管理和前端模板
Admin Bootstrap Templates Free Download 1. SB Admin 2 Preview | Details & Download 2. Admin Lite ...
- 荣耀 6 安装 SD 卡,提示:SD卡已安全移除
先前买了个 荣耀6(购买链接),自带存储只有 16G,用来一段时间后,老是提示存储不足.后来发现是 微信 等软件占用了好多存储(缓存),, 好吧,在京东上买了个 64G 扩展卡(购买链接),安装过程如 ...
- github view source
https://insight.io/ http://www.cnplugins.com/devtool/octotree/