【iOS】类簇(class cluster)

2024-06-16 20:38
文章标签 ios cluster class 类簇

本文主要是介绍【iOS】类簇(class cluster),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

类簇实际上是Foundation framework框架下的一种设计模式,它管理了一组隐藏在公共接口下的私有类。


类簇的基本概念和实现思路

为了举例说明类簇的结构体系和好处,我们先想想如何构建一个类的结构体系,然后用这个类指定一个对象来存储不同数据类型的变量(如:char,int,float,double)?因为不同数据类型的变量在使用的时候可以互相转换类型或用字符串标识,所以我们可以用一个简单的类来管理它们。可是无论怎样,它们的存储形式都是不同的,所以使用一个类来管理它们的效率很低下。考虑到这个问题,我们设计了类Number,结构如图1-1示:


图1-1 Number类的结构

Number是一个抽象的父类,它实现的方法主要是操作它的子类。Number类不会直接声明一个变量去存储不同类型的数据,而是由它的子类们去创建一个对象去存储然后将实现方法隐藏,将调用接口共享给抽象父类Number。
到目前为止,我们的设计还算合理简便,如果有一天,最基本的C类型的数据类型被修改了,加入了一些新的数据类型,那么我们的Number类的结构如下图1-2所示:


图2-2 更完善的Number类结构


注:创建一个类的时候,我们应该遵守最基本的原则,即:通过所有的子类可以很简便的管理数据对象以及后期扩展方便。

类簇的内部

使用类簇设计模式解决了上面的问题后我们的类的基本结构体系如下图1-3所示:(私有类是灰色的)


图1-3 类簇的结构


使用了类簇以后,我们只能看到公开的类Number,那么该如何创建(allocate)这些子类的实例对象呢?解决思路是利用抽象类Number来处理这些实例对象。

  • 创建实例
    在类簇设计模式中抽象类Number必须声明一个方法可以创建它的私有子类的实例对象。这个抽象类Number的主要职责就是当你在调用方法的时候,负责分发不同子类的创建实例的方法来帮助你返回正确的实例对象。(注:创建对象的类我们没有办法手动选择
    在Foundation framework框架中,一般使用类方法、或alloc和init发送消息创建一个实例对象。例如NSNumber使用如下方法创建对象:

    NSNumber *aChar = [NSNumber numberWithChar:’a’];
    NSNumber *anInt = [NSNumber numberWithInt:1];
    NSNumber *aFloat = [NSNumber numberWithFloat:1.0];
    NSNumber *aDouble = [NSNumber numberWithDouble:1.0];

    使用上面的类方法创建对象,可以不用releas对象,因为上面的类方法本质是便利构造器,在创建对象的时候已经加入了autoreleas机制。当然许多类仍然保留了最基本的alloc和init来创建一个对象,以防止你需要管理他们的dealloc实现。(注:autoreleas在将来的某个时刻自动释放池清理的时候才释放。dealloc在RC=0的时候马上调用进行清理)。
    回到正题,使用上面的创建方法返回的对象aChar、anInt、aFloat、aDouble可能由不同的私有子类创建。即使每一个对象的类从属关系(class membership)被隐藏了,但是它的接口是公开的,我们可以通过抽象类NSNumber声明的接口来访问。当然这种做法是及其不严谨的,某种意义上也是不正确的,因为NSNumber返回的对象并不是一个NSNumber的成员对象,而是一个被隐藏了的我们不知道的成员对象(如:aChar的成员关系从属于私有类Char,而不是Number)。尽管aChar、anInt、aFloat、aDouble这些对象从属关系不属于Number,这种方法不严谨,但是我们却可以很方便的使用抽象类NSNumber接口中声明的方法来实例化这些对象以及操作它们的实例方法。

拥有多个抽象公共类的类簇

在上面的例子,使用的是一个公共的抽象父类来管理很多个私有的类,公共类声明接口来供外部进行调用。但是在Foundation framework框架中也有很多使用了两个或者两个以上的公共抽象父类来管理很多个私有子类的例子,如表1-1示:
表1-1 类簇和它对应的公共抽象父类

类簇 公共抽象父类
NSData NSData NSMutableData
NSArray NSArray NSMutableArray
NSDictionary NSDictionary NSMutableDictionary
NSString NSString NSMutableString
综上所述

在Cocoa中,许多类实际上是以类簇的方式实现的,即它们是一群隐藏在通用接口之下的与实现相关的类。例如创建NSString对象时,实际上获得的可能是NSLiteralString、NSCFString、NSSimpleCString、NSBallOfString或者其他未写入文档的与实现相关的对象。所以,请不要尝试去创建NSString、NSArray或NSDictionary的子类。如果必须添加或修改某个方法,可以使用类目的方式。

注:对于类簇使用isMemberOfClass和isKindOfClass是不允许的,因为类簇是由抽象公共类管理的一组私有类,抽象公共类并不是真正的实例的父类,类簇中真正的类从属关系被隐藏了,所以使用isMemberOfClass和isKindOfClass结果可能不准确。

这篇关于【iOS】类簇(class cluster)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067491

相关文章

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

提示:Decompiled.class file,bytecode version如何解决

《提示:Decompiled.classfile,bytecodeversion如何解决》在处理Decompiled.classfile和bytecodeversion问题时,通过修改Maven配... 目录问题原因总结问题1、提示:Decompiled .class file,China编程 bytecode

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

类型信息:反射-Class

在说反射前提一个概念:RTTI(在运行时,识别一个对象的类型) public class Shapes {public static void main(String[] args) {List<Shape> shapes = Arrays.asList(new Circle(), new Square(), new Triangle());for (Shape shape : shapes

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注