<<Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法>>这本书相信很多人都读过,最近又重温了一遍,这本书很薄,只有209页,几个小时就可以看完。虽然很薄,但是写的很好,这本书的内容结构是这样的,先是摆出结论,然后再花几倍的笔墨来解释为什么要这样。如果作者去除解释部分,估计本书可以压缩到80页。这本书我看了好几遍了,但是还是感觉意犹未尽,于是自己就根据它的每个章节提了一些问题。(有的章节其实没必要提问题的,就是了解一下就够了,但是由于惯例,所以这些不太适合提问题的章节还是提问了。) 其中的少数问题其实”超纲”了,也就是仅凭本书你是答不出或者答不完整的,还需要查很多的资料才能完全答出来。有兴趣的同学可以看看自己能答出来多少。由于本人水平有限,有的问题出的不是很好,请大家在评论区多提意见,一起来修改完善,谢谢大家。
可以PDF版
第一章:熟悉Objective-C
第一条:了解Objective-C语言的起源
- 如何理解OC的动态绑定?
- 说说[xxObj doSomething]从开始执行到结束的过程。
- 从运行程序到main方法的调用,这之间发生了什么? 建议大家好好看看runtime component的实现过程,,重点看看objc-runtime-new.mm类。
第二条: 在类的文件中尽量少引用其他头文件
- 你有用过@class吗?请说一下它的常用情景。
- #import和#include的区别。
第三条:多用字面量语法,少用与之等价的方法
- 字面量语法相比传统创建方法的优势?
第四条:多用类型常量,少用#define预处理指令
- 类型常量相对于#define预处理指令的优点?
- 请手写一个通知名称的声明和实现。
第五条:多用枚举表示状态、选项、状态码
- NS_OPTIONS为什么能实现组合多个选项的功能?
- c语言的enum不是够用了吗?Foundation框架为啥要再弄一个NS_ENUM的宏?
第二章:对象、消息、运行期
第六条:理解“属性”这一概念
- 为什么说atomic不能保证属性在多线程中是安全的?请举个例子说明。你如何保证iOS中多线程中访问可变数组,可以得到正确的数据?
- 请分别说明iOS开发中@property的属性特征中的原子性,读写权限和内存管理语义的默认情况?(如什么都不写的话,是nonatomic还是atomic?)
- weak是如何实现变量销毁时指向nil的?
- @synthesize和@dynamic有什么区别?你有使用过它们吗?什么情况下会需要使用它们?请举例
- 你有在.h文件中使用readonly吗?为啥要这么设计?一般还需要在.m中做些什么来配合readonly使用?
第七条:在对象内部尽量直接访问实例变量
- 什么时候使用属性,什么时候使用实例变量?分别说说使用它们的优缺点。
- 如果在初始化方法和dealloc方法中使用了属性,可能会出现什么问题?说一说出现这种问题的原因。
第八条:理解“对象等同性”这一概念
- 自定义对象,如何实现isEqual?
- hash方法存在的意义?hash方法如何实现?为什么?为什么说相同的对象一定具有相同的哈希码,而两个哈希码相同的对象却未必相同?
第九条:以“类族模式”隐藏实现细节
- Foundation框架和UIKit框架中都有类应用了“类族模式”设计,请至少说出2个采用了这种模式的类。
- “类族模式”有什么好处?请你设计一个采用了“类族模式”的类。
第十条:在既有类中使用关联对象存放自定义数据
- 分类中的@property属性跟普通类中使用@property声明属性有什么不同?如何在分类中实现跟普通类中使用@property一样的效果?
- 你在项目中或者看到别人使用过关联对象技术吗?
第十一条:理解“objc_msgSend”的作用
- SEL的本质是什么?
- 给对象发送消息是如何”动态消息派发系统”派发的?说一说这个过程(消息传递机制)。
- 苹果为动态消息派发系统做了哪些优化来提高查找方法列表的速度?
第十二条:理解消息转发机制
- 请说说消息转发机制?你在项目中有使用过消息转发吗(在开发中的具体应用场景)?
第十三条:用“方法调配技术”调试“黑盒方法”
- 如何动态添加方法和替换方法实现?
第十四条:理解“类对象”的用意
- 说说你对类对象的理解?清楚它的内存布局吗?
第三章:接口与API设计
第十五条:用前缀避免命名空间冲突
- 你在项目中创建类和设计分类方法时,如何避免类的重复定义及分类方法的相互覆盖?
第十六条:提供“全能初始化方法”
- 如果让你设计一个类,提供多个初始化方法,你的.h文件怎么设计接口?
- 为什么在init方法中要调用super init,不调用行不行?请说明理由。
第十七条:实现description方法
- 有使用过LLDB吗?
- 在Xcode的打印含有中文字符串的字典和数组时,会出现编码和不是正常的文字,你是怎么解决的?
第十八条:尽量使用不可变对象
- 在某个类的头文件中,有个属性
@property (nonatomic, strong) NSMutableArray *friends;
,这么写有什么问题吗?如果有问题,请说明问题,如何修改?
第十九条:使用清晰而协调的命名方式
- 你平时是怎么样为方法和类与协议命名的?
第二十条:为私有方法名加前缀
- 为什么要给私有方法加前缀?
第二十一条:理解Objective-C错误模型
- 第三方崩溃日志收集平台的设计原理是什么?如果让你自己设计一个,你怎么设计出类似的功能。
第二十二条:理解NSCopying协议
- 什么是深拷贝,什么是浅拷贝,有什么区别?
- 如何实现自定义对象支持拷贝功能?
第四章:协议与分类
第二十三条:通过委托与数据源协议进行对象间通信
- 什么是委托(代理)模式?这个模式的作用是什么?
- UITableView为什么有了delegate还要增加dataSource属性,这2个属性为什么都是weak?
- UITableView的某些代理方法调用的非常频繁,频繁判断某个委托对象是否响应代理方法比较耗费性能,请问如何优化?
第二十四条:将类的实现代码分散到便于管理的数个分类之中
- 某个类的.m过于臃肿,杂糅了太多的方法,如何重构它?
- 分类里实现了与本类相同的方法,为什么会调用分类里面的方法而不调用本类的原来方法?
第二十五条:总是为第三方类的分类名称加前缀
- 增加分类和分类方法时要注意什么?(主要是命名上)
第二十六条:勿在分类中声明属性
- 为什么分类中的@property不能生成实例变量?
第二十七条:使用“class-continuation”分类隐藏实现细节
- 匿名分类跟分类有什么区别?
第二十八条:通过协议提供匿名对象
- 协议除了用于代理模式,还有什么作用?
第五章:内存管理
第二十九条:理解引用计数
- 说说你对引用计数的理解?苹果设计引用计数的用意是什么?
第三十条:以ARC简化引用计数
- ARC和MRC有什么区别?ARC是如何实现的?
- 使用了ARC还会出现内存泄露吗?请举例说明。
- weak是如何做到自动置为nil的?
第三十一条:在delloc方法中只释放引用并解除监听
- ARC下我们在dealloc方法中应该做什么事情?
第三十二条:编写“异常安全代码”时留意内存管理问题
- Java等语言中经常大量用到异常,为什么OC中比较少出现异常机制的代码?
第三十三条:以弱引用避免保留环
- weak和unsafe_unretained有什么区别?哪些情况下会用到weak,请举例。
第三十四条:以 “自动释放池块” 降低内存峰值
- 项目中有用过自动释放池吗?有什么作用?
第三十五条:用“僵尸对象”调试内存管理问题
- 如何监测项目中出现的“僵尸对象”?
第三十六条:不要使用retainCount
- 为什么不要用retainCount? retainCount不准的原因在哪里?
第六章:块与大中枢派发
第三十七条:理解”块”这一概念
- block有哪几种?它的内部结构是什么样的?
第三十八条:为常用的块类型创建typedef
- 请手写一个block属性,并分别使用typedef重新定义它。
第三十九条:用handler块降低代码分散程度
- 使用block代替代理有啥有点和缺点?分别在何种情况使用比较合适?
- NSNotificationCenter在发送通知的时候,是同步还是异步?
第四十条:用块引用其所属对象时不要出现保留环
- 什么时候容易出现block的循环引用?出现这种情况除了使用weak,还有其他的解决方法吗?
第四十一条:多用派发队列,少用同步锁
- atomic的实现原理是咋样的?
- 如何用GCD解决访问可变数组过程中的多线程安全问题?
第四十二条:多用GCD,少用performSelector系列方法
- performSelector方法有什么局限性和缺点? 如何解决。
第四十三条:掌握GCD以及操作队列的使用时机
- GCD和NSOperation各有哪些特点?你平时喜欢用哪个?
第四十四条:通过Dispatch Group机制,根据系统资源状况来执行任务
- 使用过dispatch group吗?它的作用是什么?
- GCD大概有哪些比较常用的函数?
第四十五条:使用dispatch_once来执行只需要运行一次的线程安全代码
- 请分别用2种方式来实现单例。
- dispatch_once为什么说是线程安全的?
第四十六条:不要使用dispatch_get_current_queue
- 什么情况会出现死锁?请用GCD模拟一种情况。
第七章:系统框架
第四十七条:熟悉系统框架
- 除了Foundation和UIKit框架,你还知道哪些系统框架?
第四十八条:多用块枚举,少用for循环
- 你知道哪些遍历的方法?各有什么特点?
第四十九条:对自定义其内存管理语义的collecion使用无缝桥接
- 你了解桥接技术吗?为什么需要桥接?
第五十条:构建缓存时选用NSCache而非NSDictionary
- 你了解NSCache吗?它相比于NSDictionary有哪些优点?
第五十一条:精简initialize与load的实现代码
- 有听过load和initialize方法吗?说说它们的特点。
第五十二条:别忘了NSTimer会保留其目标对象
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(repeatDoSomething) userInfo:nil repeats:YES];
这句代码有什么问题?如何解决?
最后: 答不出也没关系,因为答案会在近期公布的。