编写高质量iOS代码与OS X代码的effective方法(小结)
一、熟悉OC:
了解OC的起源:
OC和C++,Java等面向对象语言类似,不过有很方面差别。因为该语言使用 消息结构而非函数调用。
消息结构和函数调用的区别:前者是在其运行时所应执行的代码由运行环境来决定,后者由编译器决定,
若函数调用是多态的,由“虚方法表”(即是动态派发和运行时方法绑定采用的机制)查出到底执行哪个函数来实现。
关于前向声明
1.除非确有必要,否则不要引入头文件。一般来说,应在某个类的头文件中使用向前说明来提及别的类,
并在实现文件中引入那些类的头文件。这样做可以尽量降低类之间的耦合(coupling)。
2. 有时无法使用向前声明,比如要声明某个类遵循一项协议。这种情况下,尽量把该类遵循某些以的这条声明
移到class-continuation分类中,如果不行就把协议单独放在一个头文件中,然后将其引入。
(如果一个协议需要在多个类使用就可以这样新建一个.h文件来把那些公共的协议写在里面,就可以在很多地方引入使用)
关于字面量语法
1使用字面量语法代替此类对象的常规方法创建NSStirng,NSNumber,NSArray,NSDictionary.
2通过取下标操作访问数组或者字典的键对应的元素
3使用字面量语法创建数组或者字典时,若值中有nil,会抛出异常,所以务必确保值里不含nil
4多用类型常量,少使用#define预处理指令
如:在.m文件中定义
static const NSTimeInterval kAnimationDuration = 0.3
5全局常量:在头文件中使用extern来声明全局常量,在其相关实现文件中定义其值,
如:extren NSString *const LXLoginManagerNotification; .h
NSString *const LXLoginManagerNotification = @"LXLoginManagerNotification ";.m
关于枚举:NS_ENUM或者NS_OPTIONS
1用枚举表示状态,选项,状态码
如:
typedef NS_ENUM(NSInteger, DMTotalInvestmentType) {
DMTotalFincanceType = 0,
DMHoldFincanceType = 1 ,
DMOutFincanceType = 2 ,
};
二、对象、消息、运行期
关于属性
1可以用@property语法来定义对象中所封装的数据
2在对象内部读取数据时,应该直接通过实例变量来读,而写入数据时,则应通过属性来写。
3在初始化方法及dealloc方法中,总是应该直接通过实例变量来读写数据
4有时候会使用惰性初始化技术配置某一份数据,这时候通过属性来读取数据
如:-(UIView *)blueView{
if (!_blueView)
{_blueView = [blueView new];
}
return _blueView;
}
关于对象等同性
1检测对象的同等性,提供isEqual:和hash方法
关于类族模式
1以类族模式隐藏实现细节,首先要定义抽象基类 ==重构
在既有类中使用关联对象
1在既有类中使用关联对象存放自定义数据
如:
#import <objc/runtime.h>
static void *Akey = @"Akey";
- (IBAction)doClick:(id)sender {
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"question" message:@"What do you want to do?" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"continue", nil];
void (^block)(NSInteger) = ^(NSInteger buttonIndex){
if (buttonIndex==0) {
[self cancel];
}else{
[self doContinue];
}
};
objc_setAssociatedObject(alert, Akey, block, OBJC_ASSOCIATION_COPY);
[alert show];
}
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
void (^block)(NSInteger) = objc_getAssociatedObject(alertView, Akey);
block(buttonIndex);
}
理解objc_msgSend的作用:
1消息由接受者,选择子及参数构成。给对象发送消息就相当于在改对象上调用方法。void objc_msgSend(id self,SEL cmd,…);
2发给某对象的全部消息都要由 动态信息派发系统来处理,该系统会查出对应方法并执行其代码
理解消息转发机制:
经常遇到的崩溃信息:unrecognized selector sent to instance.这种办法处理过程:
1所属 的类看看能不能动态添加方法,动态方法解析;
2请接受者看有没有其他对象处理这条信息,如果有转给它,如果没有就启动完整的消息转发机制,
给接受者最后一次机会设法解决当前未处理的这条信息。
三、接口与API设计
使用前缀避免命名空间冲突
1变相实现命名空间;选择与公司,app或二者皆有关联之名称作为类名前缀,
并在所有代码中均使用这一前缀;若自己所开发的程序库中用到第三方库,为其名称加上前缀
2在类中提供一个全能初始化方法并在文档里声明,其他初始化方法均应调用此方法,
如果全能初始化方法和超类不同,复写超类中的对应方法。
3实现description方法打印有意义的信息调用description方法;
若想在调试时候打印出更详尽的对象描述信息,则要实现debugDescription方法
4使用清晰而协调的命名方式
5为私有方法名加上前缀
四、协议与分类
1如果要在委托对象上调用可选的方法,那么必须提前使用类型信息查询方法:respondsToSelector
2将类 的实现代码分散到便于管理的数个分类之中
3不要在分类中定义属性
4通过分类向类中新增实例变量,扩充私有方法不被人知道
五、内存管理
1在dealloc方法里面,应该做的事情就是释放引用并解除监听通知
2弱引用避免保留环:
3遍历collection有四种方式:for循环;NSEnumerator遍历法,快速遍历法,块枚举法。
多使用块枚举
如:-(void) enumerateObjectsUsingBlock:(void(^)(id object,NSInteger idx,BOOL *stop))block;
-(void) enumerateObjectsUsingBlock:(void(^)(id object,NSInteger idx,BOOL *stop))block{
if(shouldStop){
stop = yes;
}
}
六、块与大中枢派发(GCD)
1块的概念,可以接受参数和返回值,可以分配在栈或者堆中,也可以是全局。
2为常用的块类型创建typedef
编写高质量iOS代码与OS X代码的effective方法(小结)的更多相关文章
- iOS书摘之编写高质量iOS与OS X代码的52个有效方法
来自<Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法>一书的摘要总结 一.熟悉Objective-C 了解Objective-C语言的起源 ...
- 第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法
第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法 第一条: 了解Objective-C 语言的起源 关键区别在于 :使用消息结构的语言,其运行时所应执行 ...
- 【读书笔记】--《编写高质量iOS与OS X代码的52个有效方法》
1.Objective-C 起源: 在 C 语言基础上添加了面向对象特性,是 C 语言的超集.Objective-C 由 SmallTalk 语言演变过来,使用消息结构,运行环境由运行环境决定. OC ...
- 笔记 《Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法 》
阅读此书的笔记点: 此书目录即是对知识点最好的总结 第1章 熟悉Objective-C ---------------------------------------------- 第1条:了解Obj ...
- 《编写高质量iOS与OS X代码的52个有效方法》书籍目录
一.熟悉Objective-C 1.了解Objective-C语言的起源 2.在类的头文件中尽量少引入其他头文件 3.多用字面量语法,少用与之等价的方法 4.多用类型常量,少用#define预处理指令 ...
- 编写高质量iOS代码与OS X代码的effective 方法小结
一.熟悉OC: 了解OC的起源: OC和C++,Java等面向对象语言类似,不过有很方面差别.因为该语言使用 消息结构而非函数调用. 消息结构和函数调用的区别:前者是在其运行时所应执行的代码由运行环 ...
- 编写高质量iOS与OS X代码的52个有效方法
第一章重点: 第一条:OC的起源 OC由smalltalk语言演化而来的语言为消息结构(messaging structure)语言,其运行时所因执行的的代码由运行环境来决定:函数调用(functio ...
- 编写高质量iOS代码的52个有效方法2-1
一.变量的定义位置(用{}声明示例变量或者用@property属性声明实例变量) 1.用{}声明示例变量: 此方法生命的实例变量,编译器在编译时,会自动计算其偏移量(表示该变量距离存放对象的内存区域的 ...
- 编写高质量iOS代码的52个有效方法1-1
一.使用向前声明(@class)的好处 1.有效减少编译器编译的时间: 2.有效避免循环引用: 二.字面量语法的好处 1.字面常量 精简.可用于所有数据类型,如: NSNumber *intNumbe ...
随机推荐
- python xlwt 设置单元格样式
使用xlwt中的Alignment来设置单元格的对齐方式,其中horz代表水平对齐方式,vert代表垂直对齐方式. VERT_TOP = 0x00 上端对齐 VERT_CENTER = 0x01 居中 ...
- 第四章 初始CSS
一.引入样式 1.行内样式表 <h1 style="color: red;font-size: 18px;">10-30</h1> 2.内部样式表(在hea ...
- HTML 005 段落
HTML 段落 HTML 可以将文档分割为若干段落. HTML 段落 段落是通过 <p> 标签定义的. 实例 <p>这是一个段落 </p> <p>这是另 ...
- js中数组元素的添加和删除
js中数组元素常用添加方法是直接添加.push方法以及unshift方法 删除方法则是delete.pop.shift 集修改方法为一身的则是splice 1.添加: (1)直接添加通常都是这样 va ...
- php数据类型之浮点型
所谓浮点类型,可以理解为:我们数学里面的小数. [注意]关于精度.取值范围和科学型声明不是学习的重点.因为此块在实际开发中用的特别少.我们将此块的知识点的学习标注为,了解级别.直线电机滑台 声明方式分 ...
- 24 | MySQL是怎么保证主备一致的?
在前面的文章中,我不止一次地和你提到了binlog,大家知道binlog可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了binlog就可以跟主库保持一致了呢?今天我就正式地 ...
- 洛谷 P3374 【模板】树状数组 1 & P3368 【模板】树状数组 2 题解
一维树状数组的作用主要是单点修改,单点查询,区间修改,区间查询. 模板1是单点修改,区间查询:模板2是单点查询,区间修改. 模板1: #include<iostream> #include ...
- 利用QSystemSemaphore和QSharedMemory实现进程间通讯
https://blog.csdn.net/liji_digital/article/details/70547082 线程间的通讯可以由QSemaphore调控,以保证各个线程对同一资源的访问不冲突 ...
- jQuery相关方法6----三大系列属性
一.获取和设置元素的宽和高------width( )方法和height()方法 <!-- 点击按钮,设置div的宽和高为原来的两倍 --> <script src="ht ...
- js中 0.1+0.2 !== 0.3
1. 存储原理: 在计算机中数字无论是定点数还是浮点数都是以多位二进制的方式进行存储的.事实上不仅仅是 Javascript,在很多语言中 0.1 + 0.2 都会得到 0.3000000000000 ...