iOS -- Effective Objective-C 阅读笔记 (5)
1: 理解 '对象等同性' 概念
理解: 根据'等同性' 来比较对象是一个非常有用的功能, 不过按照 == 操作符比较出来的结果未必是我们想要的, 因为该操作比较的是两个指针本身, 而不是其所指的对象, 应该使用 NSObject 协议中声明的 'isEqual' : 方法来判断两个对象的等同性, 一般来说, 两个类型不同的对象总是不相等的, 如果已经知道两个手册对象都属于同一个类, 那么就可以使用这种方法
NSObject 协议有两个判断等同性的关键方法
- (BOOL) isEqua:l(id)object;
- (NSInteger)hash;
NSObject 类对这两个方法的默认实现是: 当且仅当 '其指针' 完全相等时, 这两个对象才相等, 如果 'isEqual' 方法判定两个对象相等, 那么其 'hash' 方法也必须返回同一个值, 但是, 如果两个对象那个的 hash 方法返回同一个值, 那么 'isEqual' 方法未必会认为两个值相等.
如果在自定义的对象中覆写这些方法, 首先,直接判断两个指针是相等, 若想等, 则其均指向同一对象, 所受测的对象也必定相等, 接下来, 比较两对象所属的类, 若不属于同一类, 则量对象不相等, 不过, 有时候我们可以认为, 一个类实例 可能与其子类实例相等, 所以要考虑这种情况, 最后,检测每个属性是否相等.
特定类所具有的等同性判定方法
数组和字典也具有特殊的等同性判定方法, isEqualToArray: isEqualToDictionary:
2: 以 '类族模式' 隐藏实现细节
'类族' 是一种很有用的模式 (也叫做 '类别方法'), 可以隐藏 '抽象基类 ' 背后的实现细节, OC 的系统框架 UIKit 中有一个名为 UIbutton 的类, 想要创建按钮, 需要实现下面这个 ' 类方法'
+ (UIButton)buttonWithType:(UIButtonType)type;
该方法所返回的对象,其类型取决于传入的按钮类型, 然而, 不管返回什么类型的对象,他们都继承自同意基类, UIButton, 这么做的意义在于, UIBUtton 类的使用者无需关心创建出来的按妞妞具体属于那个子类, 也无需创建子类实例, 只需要调用基类方法来创建即可.
创建类族
首先定义 抽象基类
typedef NS_ENUM(NSUINteger, EOCEmploeeType){
EOCRploeeTypeDeveloper,
EOCRploeeTypeDesigner,
EOCRploeeTypeFinance
};
@interface EOCEmploee: NSObject
@property (copy) NSString * name;
@property NSUinteger salary;
+ (EOCEployee*)employeeWithType:(EOCEEmployee)type;
@end
@implementation EOCEmplyee
+ (EOCEmployee*)employeeWithType:(EOCEEmployee)type{
switch (type){
case EOCRploeeTypeDeveloper:
return [EOCRploeeTypeDeveloper new];
break;
case EOCRploeeTypeDesigner:
return [EOCRploeeTypeDesigner new];
break;
case EOCRploeeTypeFinance:
return [EOCRploeeTypeFinance new];
break;
}
}
@end
在 本例 中, 基类实现了一个 '类方法', 该方法根据待创建的 实例类别 分配好对应的 类实例, 这种工厂模式 是创建嫘祖的办法之一.
cocoa 里的类族
系统框架中有许多类族, 大部分 collection 类 都是某个类族中的抽象基类, 例如 NSArray 与 NSMutableArray.
像 NSArrray 这样的类的背后其实是个类族, 明白这一点很重要, 否则或出现以下代码
id mutableArray = [];
if([mutableArray class] == [NSArray class]){
}
要知道 NSArray 是个类族, 其中的 if 语句永远不可能为真, [mutableArray class] 所返回的类型绝不可能是 NSArray 本身, 因为由 NSArray 的初始化方法所返回的那个实例其实是隐藏在类族公共接口 侯曼的内部实例.
想要判断某个实例所属的类是否位于类族之中, 可以使用 类型信息查询方法 ' isEqualOFClass:'
// 我们有时候需要向类族中新增实体子类, 不过需要注意, 在 Employee 这个例子中, 若是没有 '工厂方法'的源代码, 就无法向其中新增类别.
然而向 Cocoa 中 NSArray 这样的类族来说, 还是可以新增子类的, 但是需要遵守几条规则,
(1) 子类应该继承自 类族中的抽象基类
若想编写 NSArray 类族的子类, 则需要令其继承自不可变数组的基类 或 可变数组的基类
(2) 子类应该定义自己的数据存储方式
(3)子类应当覆写超类文档中指明覆写的方法
总结:
类族模式 可以把实现细节隐藏在一套简单的公共接口后面
系统框架中经常使用类族
从类族的公共抽象基类中继承子类时要当心, 若有开发文档, 则应首先阅读.
iOS -- Effective Objective-C 阅读笔记 (5)的更多相关文章
- iOS Testing with Xcode 阅读笔记
官方文档直通车 Performance Testing A baseline is a combination of the average time performance in ten runs ...
- Effective Java, 3e阅读笔记一
引言 本书的目标是帮助读者更加有效地使用Java编程语言及其基本类库,适用于任何具有实际Java工作经验的程序员. 本书一共90个条目,12章,每个条目讨论一条规则,这些规则反映了最有经验的优秀程序员 ...
- QCon 2015 阅读笔记 - 其他精选主题
QCon 2015阅读笔记 QCon 2015 阅读笔记 - 移动开发最佳实践 QCon 2015 阅读笔记 - 团队建设 QCon 2015 阅读笔记 - 其他精选主题 以前分享过两个主题:移动开发 ...
- QCon 2015 阅读笔记 - 移动开发最佳实践
所有ppt下载地址:http://pan.baidu.com/s/1mg9o4TM 下面是移动开发实践部分的阅读笔记. 移动开发网络性能优化实践 - 陈浩然 (携程) 携程是非常标准的移动App架构, ...
- SDL源码阅读笔记(1) 基本模块
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 前言 对于大牛来说,写关于阅读源码的文章都会叫源码剖析或者深入浅出啥的,对于我,自己阅读阅读源码,写 ...
- 《STL源代码剖析》---stl_deque.h阅读笔记(2)
看完,<STL源代码剖析>---stl_deque.h阅读笔记(1)后.再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque. ...
- 阅读笔记 1 火球 UML大战需求分析
伴随着七天国庆的结束,紧张的学习生活也开始了,首先声明,阅读笔记随着我不断地阅读进度会慢慢更新,而不是一次性的写完,所以会重复的编辑.对于我选的这本 <火球 UML大战需求分析>,首先 ...
- [阅读笔记]Software optimization resources
http://www.agner.org/optimize/#manuals 阅读笔记Optimizing software in C++ 7. The efficiency of differe ...
- 《uml大战需求分析》阅读笔记05
<uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...
- <<UML大战需求分析>>阅读笔记(2)
<<UML大战需求分析>>阅读笔记(2)> 此次读了uml大战需求分析的第三四章,我发现这本书讲的特别的好,由于这学期正在学习设计模式这本书,这本书就讲究对uml图的利用 ...
随机推荐
- 3 数据分析之Numpy模块(2)
数组函数 通用元素级数组函数通用函数(即ufunc)是一种对ndarray中的数据执行元素级的运算.我们可以将其看做是简单的函数(接收一个或多个参数,返回一个或者多个返回值). 常用一元ufunc: ...
- 一、Redis-NoSQL数据库
转载:[https://blog.csdn.net/aaronthon/article/details/81714528 ] [https://www.cnblogs.com/StanleyBlogs ...
- UIAutomator简介
简介 Android 4.3发布的时候包含了一种新的测试工具–uiautomator,uiautomator是用来做UI测试的.也就是普通的手工测试,点击每个控件元素 看看输出的结果是否符合预期.比如 ...
- Linux 版本svn安装
CentOS6.5离线安装subversion 下载 linux rpm安装包 (我只下载了subversion-1.6.12-1.rhel5.x86_64.rpm),直接安装时会提示缺少依赖,在 r ...
- 协方差(Covariance)
统计学上用方差和标准差来度量数据的离散程度 ,但是方差和标准差是用来描述一维数据的(或者说是多维数据的一个维度),现实生活中我们常常会碰到多维数据,因此人们发明了协方差(covariance),用来度 ...
- Codeforces 629D Babaei and Birthday Cakes DP+线段树
题目:http://codeforces.com/contest/629/problem/D 题意:有n个蛋糕要叠起来,能叠起来的条件是蛋糕的下标比前面的大并且体积也比前面的大,问能叠成的最大体积 思 ...
- BSGS算法
BSGS算法 我是看着\(ppl\)的博客学的,您可以先访问\(ppl\)的博客 Part1 BSGS算法 求解关于\(x\)的方程 \[y^x=z(mod\ p)\] 其中\((y,p)=1\) 做 ...
- 【bfs】麻将游戏
题目 来自:yinzm的blog 在一种"麻将"游戏中,游戏是在一个有W*H格子的矩形平板上进行的.每个格子可以放置一个麻将牌,也可以不放(如图所示).玩家的目标是将平板上的所有可 ...
- 从零开始部署javaWeb项目到阿里云上面
[详情请看]http://www.cnblogs.com/softidea/p/5271746.html 补充几点特别需要注意的事情 一:putty相当于阿里云的控制台, WinSCP 相当于是专门上 ...
- Vue(二)简单入门
根据上一节搭建的hello-world工程(包含Router),用Webstorm打开,我们先运行一下工程. 界面如下 .. 我将在About里面介绍一下Vue的相关内容. 打开About.vue,修 ...