一、熟悉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 方法小结的更多相关文章

  1. iOS书摘之编写高质量iOS与OS X代码的52个有效方法

    来自<Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法>一书的摘要总结 一.熟悉Objective-C 了解Objective-C语言的起源 ...

  2. 第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法

    第一章 熟悉Objective -C   编写高质量iOS与OS  X代码的52 个有效方法   第一条: 了解Objective-C 语言的起源 关键区别在于 :使用消息结构的语言,其运行时所应执行 ...

  3. 【读书笔记】--《编写高质量iOS与OS X代码的52个有效方法》

    1.Objective-C 起源: 在 C 语言基础上添加了面向对象特性,是 C 语言的超集.Objective-C 由 SmallTalk 语言演变过来,使用消息结构,运行环境由运行环境决定. OC ...

  4. 笔记 《Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法 》

    阅读此书的笔记点: 此书目录即是对知识点最好的总结 第1章 熟悉Objective-C ---------------------------------------------- 第1条:了解Obj ...

  5. 《编写高质量iOS与OS X代码的52个有效方法》书籍目录

    一.熟悉Objective-C 1.了解Objective-C语言的起源 2.在类的头文件中尽量少引入其他头文件 3.多用字面量语法,少用与之等价的方法 4.多用类型常量,少用#define预处理指令 ...

  6. 编写高质量iOS与OS X代码的52个有效方法

    第一章重点: 第一条:OC的起源 OC由smalltalk语言演化而来的语言为消息结构(messaging structure)语言,其运行时所因执行的的代码由运行环境来决定:函数调用(functio ...

  7. 编写高质量iOS代码与OS X代码的effective方法(小结)

    一.熟悉OC: 了解OC的起源: OC和C++,Java等面向对象语言类似,不过有很方面差别.因为该语言使用  消息结构而非函数调用. 消息结构和函数调用的区别:前者是在其运行时所应执行的代码由运行环 ...

  8. 编写高质量iOS代码的52个有效方法2-1

    一.变量的定义位置(用{}声明示例变量或者用@property属性声明实例变量) 1.用{}声明示例变量: 此方法生命的实例变量,编译器在编译时,会自动计算其偏移量(表示该变量距离存放对象的内存区域的 ...

  9. 编写高质量iOS代码的52个有效方法1-1

    一.使用向前声明(@class)的好处 1.有效减少编译器编译的时间: 2.有效避免循环引用: 二.字面量语法的好处 1.字面常量 精简.可用于所有数据类型,如: NSNumber *intNumbe ...

随机推荐

  1. 敏捷软件开发:原则、模式与实践——第14章 使用UML

    第14章 使用UML 在探索UML的细节之前,我们应该先讲讲何时以及为何使用它.UML的误用和滥用已经对软件项目造成了太多的危害. 14.1 为什么建模 建模就是为了弄清楚某些东西是否可行.当模型比要 ...

  2. Orchard扩展 自定义后台管理导航菜单 Admin Menu

    金天:学习一个新东西,就要持有拥抱的心态,如果固守在自己先前的概念体系,就会有举步维艰的感觉. 金天:看源码永远是Coder学习的最快捷路径.     看本文需要对Orchard大致体系, 特别是Mo ...

  3. tair源码分析——leveldb新增的CompactRangeSelfLevel过程

    tair是一个分布式KV存储引擎,当新增机器或者有机器down掉的时候,tair的dataserver会根据ConfigServer生成的新的对照表进行数据的迁移和清理.在数据清理的过程中就用到了在t ...

  4. PHP中IP地址与整型数字互相转换详解

    这篇文章主要介绍了PHP中IP地址与整型数字互相转换详解,本文介绍了使用PHP函数ip2long与long2ip的使用,以及它们的BUG介绍,最后给出自己写的两个算法,需要的朋友可以参考下 IP转换成 ...

  5. Python 元组知识点

    1.元组是一个有序的集合,2.元组和列表一样可以使用索引.切片来取值.3.创建元组后不能在原地进行修改替换等操作.4.元组支持嵌套,可以包含列表.字典和不同元组.5.元组支持一般序列的操作,例如:+. ...

  6. Nginx+Lua+Redis 对请求进行限制

    Nginx+Lua+Redis 对请求进行限制 一.概述 需求:所有访问/myapi/**的请求必须是POST请求,而且根据请求参数过滤不符合规则的非法请求(黑名单), 这些请求一律不转发到后端服务器 ...

  7. Intent详解

    ntent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重要. 一.什么是Intent 1.Intent的概念: Android中提供了Intent机制来协助应用间的交互与通 ...

  8. NOIP2013普及组 -SilverN

    T1  计数问题 题目描述 试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9)共出现了多少次?例如,在 1 到 11 中,即在 1.2.3.4.5.6.7.8.9.10.11 中, ...

  9. 翻译《Writing Idiomatic Python》(一):if语句、for循环

    开篇废话 这是在美国Amazon上评价很不错的一本书,其实严格来说这可能不算书,而是一本小册子.就像书名一样,里面的内容主要是用一些例子讲述地道的Python的代码是怎样写的.书中把很多例子用不良风格 ...

  10. HDU 3487 Play with Chain 【Splay】

    1-n的序列,有两种操作: 1,将一段区间翻转 2,将一段区间切下来放到剩余序列的第C个数后 采用延迟更新的方法维护区间的翻转,并维护一个size域. 添加一个最大点和一个最小点,防止出界 翻转时,将 ...