《编写高质量iOS与OS X代码的52个有效方法》22-27

第22条:理解NSCopying协议

  1. NSZone是以前开发程序时,会据此把内存分成不同的区(zone),而对象会创建在某个区里面。现在不用了,每个程序只有一个区:“默认区”(default zone),所以不用担心其中的zone参数。
  2. 平时我们使用的copy和mutableCopy其实调用的就是copyWithZone和mutableCopyWithZone两个方法
  3. Foundation 框架中的所有 collection 类在默认的情况下都执行浅拷贝
  4. 不要假定遵循了 NSCopying 协议的对象都会执行深拷贝,在绝大多数情况下,执行的都是浅拷贝。如果需要在某对象上执行深拷贝,那么除非该类的文档说它是用深拷贝来实现的 NSCopying 协议的,否则,要么寻找能够执行深拷贝的相关办法,要么自己编写方法来做

要点:

  • 若想令自己所写的对象具有拷贝功能,则需实现NSCoping协议。
  • 如果自定义的对象分为可变版本与不可变版本,那么要同时实现NSCoping与NSMutableCoping协议。
  • 复制对象时需要决定采用浅拷贝还是深拷贝,一般情况下应该尽量执行浅拷贝。
  • 如果你所写的对象需要深拷贝,那么可考虑新增一个专门执行深拷贝的方法。

第23条:通过委托与数据源协议进行对象间通讯

  1. 本类中存放委托对象的这个属性要么定义成weak,要么定义成unsafe_unretained,如果需要在相关对象销毁时自动清空(autoiling),则定义为前者,若不需要自动清空,则定义为后者。

  2. 位段(bitfield)数据类型,这是一项乏人问津的C语言特性,以下didReceiveData三项字段都只占用一个二进制位,可以设置Bool类型来缓存委托对象是否能响应相关协议方法,起优化作用。

     @interface EPCNetworkFetcher() {
     struct {
         unsigned int didReceiveData :1
         unsigned int didFailWithError   :1
         unsigned int didUpdateProgressTo    :1
         }_delegateFlags
     }
    

要点:

  • 委托模式为对象提供了一套接口,使其可由此将相关事件告知其他对象。
  • 将委托对象应该支持的接口定义成协议,在协议中把可能需要处理的事件定为方法。
  • 当某对象需要从另外一个对象中获取数据时,可以使用委托模式。这种情境下,该模式亦称“数据源协议”(data source protocal)。
  • 若有必要,课实现含有位段的结构体,将委托对象是否能响应相关协议方法这一信息缓存至其中。

第24条:将类的实现代码分散到便于管理的数个分类之中

  1. 通过分类机制,可以把类代码分成很多个易于管理的小块,以便单独检视。
  2. 便于调试,对于某个分类中的所有方法来说,分类名称都会出现在其符号中。

要点:

  • 使用分类机制把类的实现代码划分成易于管理的小块。
  • 将应该视为“私有”的方法归入名为Private的分类中,以隐藏实现细节。

第25条:总是为第三方类的分类名称加前缀

  1. 将分类方法加入类中这一操作是在运行期系统加载分类时完成的。
  2. 分类中的方法是直接添加在类里面的,它们就好比这个类中的固有方法。将分类方法加入类中这一操作是在运行期系统加载分类时完成的。运行期系统会把分类中所实现的每个方法都加入类的方法列表中。如果类中本来就有此方法,而分类又实现了一次,那么分类中的方法会覆盖原来那一份实现代码。
  3. 自己实现的分类方法一定要添加前缀,不然覆盖了原有的方法,出现这种bug是很难查找的

要点:

  • 向第三方类中添加分类时,总应给其名称加上你专用的前缀。
  • 向第三方类中添加分类时,总应给其中的方法名加上你专用的前缀。

第26条:勿在分类中声明属性

  1. 可以用关联技术给分类添加属性,但是这样做不太理想。一是要把相似的代码写很多遍,而且在内存管理问题上容易出错,因为我们在为属性实现存取方法时,经常会忘记遵从其内存管理语义。比方说,你可能通过属性特质(attribute)修改了某个属性的内存管理语义。而此时还记得,在设置方法中也得修改设置关联对象时所用的内存管理语义才行。所以说,尽管这个做法不坏,但笔者不推荐。
  2. 属性是用来封装数据的,而分类的目标在于扩展类的功能,而非封装数据

要点:

  • 把封装数据所用的全部属性都定义在主接口里。
  • 在 “class-continuation” 分类之外的其他分类中,可以定义存取方法,但尽量不要定义属性。原因见1

第27条:使用 “class-continuation 分类” 隐藏实现细节

  1. 凡是引入了C++的头文件的类,其实现文件都要更改为可编译OC++文件的.mm格式
  2. 要想使类的代码更易读懂,在编写类的实现代码之前,建议先把方法原型写出来,然后再逐个实现。

要点:

  • 通过 “class-continuation 分类” 想类中新增实例变量。
  • 如果某属性在主接口中声明为 “只读” ,而类的内部又要用设置方法修改此属性,那么就在 “class-continuation 分类” 中将其扩展为 “可读写”。
  • 把私有方法的原型声明在 “class-continuation 分类” 里面。
  • 若想使类所遵循的协议不为人所知,则可于 “class-continuation 分类” 中声明。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容