您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>通讯/手机编程>

iOS系统OC经典之作解读

大小:0.2 MB 人气: 2017-09-25 需要积分:1

最近在重温这本OC经典之作《Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法》,这篇文章算是重温之后的产物吧,读完这篇文章你将快速读完这本书,由于个人能力有限,难免有一些遗漏或者错误,请各位看官不吝赐教!谢谢!同时如果有任何问题也可以在下方留言,欢迎一起交流进步!另外由于篇幅原因,书中一些基础知识的介绍文中就省略掉了。

目录

上面就是这本书的目录,可以点击这里下载PDF版,原版英文版PDF我也有存~

第一章:熟悉Objective-C

第一条:了解Objective-C语言的起源

Objective-C从Smalltalk语言是从Smalltalk语言演化而来,

Smalltalk是消息语言的鼻祖。

Objective-C是C语言的超集,在C语言基础上添加了面向对象等特性,可能一开始接触时你会觉得语法有点奇怪,那是因为Objective-C使用了动态绑定的消息结构,而JavaC++等等语言使用的是函数调用。

消息结构与函数调用的关键区别在于:函数调用的语言,在编译阶段由编译器生成一些虚方法表,在运行时从这个表找到所要执行的方法去执行。而使用了动态绑定的消息结构在运行时接到一条消息,接下来要执行什么代码是运行期决定的,而不是编译器。

第二条: 在类的文件中尽量少引用其他头文件

如果需要引用一个类文件时,只是需要使用类名,不需要知道其中细节,可以用@class xx.h,这样做的好处会减少一定的编译时间。如果是用的#import全部导入的话,会出现a.h import了b.h,当c.h 又import a.h时,把b.h也都导入了,如果只是用到类名,真的比较浪费,也不够优雅

有时候无法使用@class向前声明,比如某个类要遵循一项协议,这个协议在另外一个类中声明的,可以将协议这部分单独放在一个头文件,或者放在分类当中,以降低引用成本。

第三条:多用字面量语法,少用与之等价的方法

1.多使用字面量语法来创建字符串,数组,字典等。

传统创建数组方法:

1

2

3

4  NSArray *languages = [NSArray arrayWithObjects:@ “PHP” , @ “Objective-C” , someObject, @ “Swift” , @ “Python” , nil];

NSString *Swift = [languages objectAtIndex:2];

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@ “key” , @ “value” , nil];

NSString *value = [languages objectForKey:@ “key” ];

字面量:

1

2

3

4  NSArray *languages = @[@ “PHP” , @ “Objective-C” , someObject, @ “Swift” , @ “Python” ];

NSString *Swift = languages[2];

NSDictionary *dict = @{@ “key” : @ “value” };

NSString *value = languages[@ “key” ];

这样做的好处:使代码更简洁,易读,也会避免nil问题。比如languages数据中 someObject 如果为nil时,字面量语法就会抛出异常,而使用传统方法创建的languages数组值确是@[@“PHP”, @“Objective-C”];因为字面量语法其实是一种语法糖,效果是先创建了一个数组,然后再把括号中的对象都加到数组中来。

不过字面量语法有一个小缺点就是创建的数组,字符串等等对象都是不可变的,如果想要可变的对象需要自己多执行一步mutableCopy,例如

1  NSMutableArray *languages = [@[@ “PHP” , @ “Objective-C” , @ “Swift” , @ “Python” ] mutableCopy];

第四条:多用类型常量,少用#define预处理指令

第4条第5条看这里

第五条:多用枚举表示状态、选项、状态码

第4条第5条看这里

第二章:对象、消息、运行期

第六条:理解“属性”这一概念

这一条讲的是属性的基本概念,以及属性的各种修饰符,这些就不多啰嗦了,这里强调一下:

定义对外开放的属性时候尽量做到暴露权限最小化,不希望被修改的属性要加上readonly。

atomic 并不能保证多线程安全,例如一个线程连续多次读取某个属性的值,而同时还有别的线程在修改这个属性值得时候,也还是一样会读到不同的值。atomic 的原理只是在 setter and getter 方法中加了一个@synchronized(self),所以iOS开发中属性都要声明为nonatomic,因为atomic严重影响了性能,但是在Mac OSX上开发却通常不存在这个性能问题

说一下下面的哪个属性声明有问题

1

2

3

4  @property (nonatomic, strong) NSArray *arrayOfStrong;

@property (nonatomic, copy) NSArray *arrayOfCopy;

@property (nonatomic, strong) NSMutableArray *mutableArrayOfStrong;

@property (nonatomic, copy) NSMutableArray *mutableArrayOfCopy;

具体运行示例点击查看

答案是正常应该这样声明

1

2  @property (nonatomic, copy) NSArray *arrayOfCopy;

@property (nonatomic, strong) NSMutableArray *mutableArrayOfStrong;

第七条:在对象内部尽量直接访问实例变量

在类内读取属性的数据时,应该通过直接实例变量来读,这样不经过Objecit-C的方法派发,编译器编译后的代码结果是直接访问存实例变量的那块内存中的值,而不会生成走方法派发的代码,这样的速度会更快。

给属性写入数据时,应该通过属性的方式来写入,这样会调用setter 方法。但是在某种情况下初始化方法以及dealloc方法中,总是应该直接通过实例变量来读写数据,这样做是为了避免子类复写了setter方法造成的异常。

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!