Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法

Effective Objective-C 2.0 读书笔记

最近这本书的1刷已经结束了,然后回过头来看首先是觉得理解的不够深入,其次是拓展的不够宽泛,所以总结一下,把核心的东西抽出来便于理解。
1刷是电子书,刷到末期的时候,直接买了实体书,二刷还是看实体书吧。

Tip:50 构建缓存时选用NSCache而非NSDictionary

应用场景:下载图片的后,把内存中的图片保留下来,以便稍后再用。

NSCache的优点:

  1. 系统发出低内存通知的时候,依据最久未使用(LRU)自动删减存储在其中的对象。
  2. 是线程安全的,
  3. 通过改变NSCache属性中的缓存对象的个数,以及指定缓存空间的大小(开销),当对象总数或者总开销超过上限的时候缓存就可能会删除其中的对象。

NSPurgeableData:

适用范围解读

如果某个对象所占的内存可以随时丢弃,就可以用这个。

也就是说,这个类可以把对象标记为<必要时可以丢弃自己所占的内存>

实现原理

实现了NSDiscardableContent协议,这个协议的作用是让实现该协议所定义的接口的对象的内存能够根据需要随时丢弃。

使用方法

//需要访问的时候,调用如下方法,告诉其还不应该丢弃自己所占的内存
[cacheData beginContentAccess];
//使用完之后,调用如下方法,告诉其必要的时候可以丢弃内存
[cacheData endContentAccess];
/*类似引用计数成对出现,创建NSPurgeableData的操作也会被视为'引用计数+1'*/

Tip:51 精简initialize 与 load 的实现代码

首先这两个方法是属于NSObject的,可以用来实现初始化操作。

load

调用时机:当类和分类加入运行期系统的时候。【程序会阻塞等所有类load执行完才继续】

执行顺序:在执行子类之前,先执行超类的Load方法,如果有其他依赖库,那他们的load方法也会执行(无法判断类的载入顺序)

特点:不遵循继承规则。就是说超类实现load方法,子类如果没有实现load,系统就不会调用load方法。类的load要比分类的load先执行。

注意事项:程序在执行load方法时都会阻塞,【不要】在load中执行任何的任务。

用途:【调试】,在分类中编写次方法,判断分类是否正确载入系统。

initlalize

调用时机:程序首次用该类之前调用,只调用一次。不要手动调用(它是由运行期系统调用的)

执行顺序:执行的时候,运行期系统处于正常状态(应该讲的是所有类都已经加载到运行期系统中),然后可以在其中安全的调用任意类的任意方法。

安全性:initlalize是线程安全的。执行它的时候,其他想要操作initlalize所在类的其他线程都会阻塞等其initlalize执行完。

特点:遵循继承规则,子类会实现父类的initlalize方法。

总结

  1. 初始化方法里面仅仅适合设置一些状态,不适合执行复杂&加锁的任务。
  2. 初始化类的线程是随机的。当时UI线程时,初始化期间就会一直阻塞导致应用程序无响应。
  3. 无法控制类的初始化时机,也不能令初始化依赖特定的时间点。(万一运行期系统略微调整,那代码就失效了)
  4. 当在初始化方法中(直接或间接)使用到其他类的时候,其他类的initlalize方法中需要用到本类的数据,但是本类的initlalize方法还没运行完毕,数据可能还没准备好。

应用

initlalize方法只应该用来设置内部数据。

比如说某个全局状态无法在编译期间初始化。

point整数可以在编译期定义,可变数组对象不可以(NSString是可以的),所以创建期间必须先激活运行期系统。也就是说让运行期系统处于【安全期状态】

所以可以在initlalize方法中初始化全局的可变数组,代码如下

static NSMutableArray *kSomeObjects;
@implementation MyClass
+ (void)initlalize{
  //只在当前类初始化,因为initlalize遵循继承规则,会被子类调用,所以要加个判断,让代码在本类执行。
  if(self == [MyClass class]){
    kSomeObjects = [NSMutableArray new];
  }
}

Tip:52 别忘了NSTimer会保留其目标对象。

基础知识:

  1. 计时器要和RunLoop相关联,Runloop到了设定的时间会出发任务。
  2. NSTimer会保留其目标对象,等到自身实现的时候再释放。
  3. 一次性的定时器任务结束的时候失效,重复执行的要手动调用invalidate方法使其失效。

出现保留环的情况:当没有显示调用invalidate方法时,就把使用定时器的类释放了。这时候NSTimer作为所在类的实例对象,会被类强引用。而且本类作为NSTimer的target也会被NSTimer强引用。因此出现循环引用的情况。

解决方案:为NSTimer添加一个类方法,通过Block创建NSTimer对象。

code.png

userInfo中可以存储任意类型,因为我们要在回调方法中调用block,但是分类不容易添加属性,所以就把block拷贝后放到userInfo中,然后在回调方法的参数中取出block来调用。

新的方式:对于调用此方法创建的NSTimer的时候,就可以通过传入weakSelf 的方式,来打破block的循环引用了。

Q&A

Q:分类中,block方式创建NSTimer的方法体中不是会强引用NSTimer类对象么?

A:NSTimer类对象是个单例,计时器是否会保留它都无所谓。因为类对象无需回收。

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

推荐阅读更多精彩内容