一、熟悉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. Effective Java 52 Refer to objects by their interfaces

    Principle If appropriate interface types exist, then parameters, return values, variables, and field ...

  2. Effective Java 57 Use exceptions only for exceptional conditions

    Principle Exceptions are, as their name implies, to be used only for exceptional conditions; they sh ...

  3. HttpClient使用方法(包括POST文件)

    最近在做跨系统的数据交互业务,从.Net的系统提交数据到Java的系统. 简单的表单Get.POST都没问题,但是有个功能是要提交普通文本和文件,试了好多都有问题,最后用HttpClient小折腾了一 ...

  4. XShell上传、下载文件(使用sz与rz命令)!

    rz,sz是Linux/Unix同Windows进行ZModem文件传输的命令行工具.优点就是不用再开一个sftp工具登录上去上传下载文件. sz:将选定的文件发送(send)到本地机器rz:运行该命 ...

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

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

  6. Linux root 密码重置与用户管理

    ---forget root password restart your linux system press 'e' when start. press 'e' again then choose ...

  7. [转]ASP.NET MVC 4 (九) 模型绑定

    本文转自:http://www.cnblogs.com/duanshuiliu/p/3706701.html 模型绑定指的是MVC从浏览器发送的HTTP请求中为我们创建.NET对象,在HTTP请求和C ...

  8. myeclipse中运行tomcat报错java.lang.NoClassDefFoundError

    有关myeclipse的小问题,在myeclipse中运行tomcat时显示已启动,但是无法访问localhost:8080/,显示404错误.在控制台中发现报错代码如下: java.lang.NoC ...

  9. 双向广搜 POJ 3126 Prime Path

      POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted ...

  10. 广度优先搜索 codevs 2806 红与黑

    codevs 2806 红与黑  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 白银 Silver   题目描述 Description 有一个矩形房间,覆盖正方形瓷砖.每块瓷砖 ...