iOS系统OC经典之作解读
最近在重温这本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使用了动态绑定的消息结构,而Java,C++等等语言使用的是函数调用。
消息结构与函数调用的关键区别在于:函数调用的语言,在编译阶段由编译器生成一些虚方法表,在运行时从这个表找到所要执行的方法去执行。而使用了动态绑定的消息结构在运行时接到一条消息,接下来要执行什么代码是运行期决定的,而不是编译器。
第二条: 在类的文件中尽量少引用其他头文件
如果需要引用一个类文件时,只是需要使用类名,不需要知道其中细节,可以用@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%
下载地址
iOS系统OC经典之作解读下载
相关电子资料下载
- iOS17.1可能明天发布,iOS17.1主要修复哪些问题? 377
- 华为全新鸿蒙蓄势待发 仅支持鸿蒙内核和鸿蒙系统应用 719
- 苹果手机系统iOS 17遭用户质疑 731
- iPhone12辐射超标?苹果推送iOS 17.1解决此事 750
- 传华为囤积零部件 目标明年智能手机出货7000万部;消息称 MiOS 仅限国内,小米 28208
- 苹果推送iOS17.0.3,解决iPhone15Pro系列存在机身过热 216
- Testin云测兼容和真机服务平台中上线iPhone 15系列手机 208
- 利尔达推出搭载HooRiiOS的Matter模组 145
- 运放参数解析:输入偏置电流(Ibias)和失调电流(Ios) 128
- 昆仑太科发布支持国产飞腾腾锐D2000芯片的开源BIOS固件版本 448