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图的利用 ...
随机推荐
- SpringBoot2.0的CacheManager配置
http://rickgong.iteye.com/blog/2414263 @Configurationpublic class RedisConfig extends CachingConfigu ...
- mysql查看存储过程函数
查询数据库中的存储过程和函数 select `name` from mysql.proc where db = 'xx' and `type` = 'PROCEDURE' //存储过程 ...
- Shell命令-文件及内容处理之vi、vim
文件及内容处理 - vi.vim 1.Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器 ...
- Qin Shi Huang's National Road System HDU - 4081(树形dp+最小生成树)
Qin Shi Huang's National Road System HDU - 4081 感觉这道题和hdu4756很像... 求最小生成树里面删去一边E1 再加一边E2 求该边两顶点权值和除以 ...
- mpvue——API请求封装(小程序原生)
前言 能用,但不是最好的方法,最好的还是fly,因为为了以后多平台的考虑,最好使用fly.js,做之前先关闭校验合法域名,因为我没在后台进行配置 后台进行配置合法域名,按着官方给的配置就OK了,这里就 ...
- 【XSY2666】排列问题 DP 容斥原理 分治FFT
题目大意 有\(n\)种颜色的球,第\(i\)种有\(a_i\)个.设\(m=\sum a_i\).你要把这\(m\)个小球排成一排.有\(q\)个询问,每次给你一个\(x\),问你有多少种方案使得相 ...
- PKUWC2019爆0记
PKUWC2019爆0记 访问量该骗的还是要骗. 1.20 坐了一天的高铁到jz了,热的一批 1.21 上午开营仪式 下午day1 打开发现有个地主斗 然后开T1 出题人你™搞笑吧放一道sb都能切的题 ...
- 任意模数NTT学习笔记
这两天有点颓,所以东西学的也很慢...这个一眼就能推出来的活生生卡了我两天.. 说几个细节: 柿子: \[f*g = (\frac{f}{M} +f\%m)*(\frac{g}{M} +g\%m) \ ...
- MFC(1):vc6.0转vs2005出现的问题
在将vc6.0程序转换到vs2005或者vs2008.vs2010时提示:error C2440: 'static_cast' : cannot convert from 'UINT (__this ...
- ArcGis Python脚本——根据接图表批量裁切分幅影像
年前写了一个用渔网工具制作图幅接图表的文章,链接在这里: 使用ArcMap做一个1:5000标准分幅图并编号 本文提供一个使用ArcMap利用接图表图斑裁切一幅影像为多幅的方法. 第一步,将接图表拆分 ...