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图的利用 ...
随机推荐
- Cinder组件
cinder-api cinder-api 是整个 Cinder 组件的门户,所有 cinder 的请求都首先由 cinder-api 处理. cinder-api 向外界暴露若干 HTTP REST ...
- spring boot 操作MySQL pom添加的配置
1 在项目中的pom.xml配置文件添加依赖 <!--MySQL依赖 --> <dependency> <groupId>mysql</groupId> ...
- 在IIS上搭建WebSocket服务器(一)
一.搭建环境 1.System.Web.WebSockets需搭建在Windows8及Server2012以上系统的上. 2.在Windows8及Server2012以上系统的上安装IIS和WebSo ...
- Active Directory: LDAP Syntax Filters
LDAP syntax filters can be used in many situations to query Active Directory. They can be used in VB ...
- WebView 安全之 addJavascriptInterface
WebView是Android平台下的一个重要组件,通常用来在Activity中嵌入一个简单的浏览器,实现在线网页浏览的功能.比如下面代码实现访问Google页面: WebView webView = ...
- Java连接远程Mysql过程中遇到的各种问题
2018-11-16 10:46 2018-11-19 21:35 前言 本篇文章记录的是本人在使用Java程序连接另一台电脑(同一局域网)上的Mysql数据库的过程中遇到的各种问题及解决方案.希望能 ...
- Django admin组件源码流程
admin 组件 Django 自带的用户后台组件 用于用户便携的操作 admin 组件核心 启动 注册 设计url 启动核心代码 每个app 通过 apps.py 扫描 admin.py 文件 并执 ...
- 10.4 Vue 父子传值
简单示例 APP.vue <template> <div> <img :src="imgSrc"> <!-- 父子传值 --> &l ...
- 小程序运行报错:errMsg: "request:fail url not in domain list"
错误原因: 报错提示说请求的url不在域名列表里,应该是还没有配置服务器域名 解决方法: 可点击开发者工具右上角 详情-项目设置-不校验合法域名.web-view(业务域名).TLS 版本以及 HTT ...
- 最大公约数和最小公倍数(Greatest Common Divisor and Least Common Multiple)
定义: 最大公约数(英语:greatest common divisor,gcd).是数学词汇,指能够整除多个整数的最大正整数.而多个整数不能都为零.例如8和12的最大公因数为4. 最小公倍数是数论中 ...