SDWebImage源码解读 (六)

https://github.com/BiBoyang/Study

暂时告一段落,剩余的有时间再去阅读。
这里准备写一下相关的问题。


image

image

(一) 加载大图的内存暴涨的原因

这个应该写到压缩解码里的。但是那边没写完,就放到这里。

[[SDImageCache sharedImageCache] setShouldDecompressImages:NO];
[[SDWebImageDownloader sharedDownloader] setShouldDecompressImages:NO];

使用这两个方法。
我们将图片存储的时候,是二维化的存储的,会将图像存储为位图数据,如果图像过大,将它存储的结果也会过大。这个是空间换时间的做法,但是同样会也带来内存暴涨,甚至被系统干掉的危险。
所以,为了避免这种情况,我们可能要对大图片做专门的设计。比如说点击高清,或者停止缓存。
有关解码可以查看这篇文章

(二) setNeedsLayout方法的作用

直接点说,就是给当前的UIView添加一个标记,让它马上开始刷新布局。
我们可以看一下官方解释

Invalidates the current layout of the receiver and triggers a layout update during the next update cycle.
Call this method on your application’s main thread when you want to adjust the layout of a view’s subviews. This method makes a note of the request and returns immediately. Because this method does not force an immediate update, but instead waits for the next update cycle, you can use it to invalidate the layout of multiple views before any of those views are updated. This behavior allows you to consolidate all of your layout updates to one update cycle, which is usually better for performance.
使接收器的当前布局无效,并在下一更新周期触发布局更新。
当您想调整视图的子视图布局时,请在应用程序的主线程上调用此方法。该方法记录请求并立即返回。因为此方法不强制立即更新,而是等待下一个更新周期,所以您可以使用它来在更新任何视图之前使多个视图的布局无效。这种行为允许您将所有布局更新合并到一个更新周期,这通常对性能更好。
image

这里我们借用这张图,简单阐述一下(只说最右边的方框内的方法):

在Touches传递到了视图上的时候,会调整视图的UI属性,比如frame,透明度神马的;会被表示为setNeedsLayout;会被标识为setNeedsDisplay。
接着会被传到layoutSubviews,如果确定要被重新布局,就会开始调用layoutsubviews方法;
如果需要重新绘制,会调用drawRect方法。

这里要了解一个概念:The View Drawing Cycle

The UIView class uses an on-demand drawing model for presenting content. When a view first appears on the screen, the system asks it to draw its content. The system captures a snapshot of this content and uses that snapshot as the view’s visual representation. If you never change the view’s content, the view’s drawing code may never be called again. The snapshot image is reused for most operations involving the view. If you do change the content, you notify the system that the view has changed. The view then repeats the process of drawing the view and capturing a snapshot of the new results.
When the contents of your view change, you do not redraw those changes directly. Instead, you invalidate the view using either the setNeedsDisplay or setNeedsDisplayInRect: method. These methods tell the system that the contents of the view changed and need to be redrawn at the next opportunity. The system waits until the end of the current run loop before initiating any drawing operations. This delay gives you a chance to invalidate multiple views, add or remove views from your hierarchy, hide views, resize views, and reposition views all at once. All of the changes you make are then reflected at the same time.

我们可以很容易的理解,将多次修改聚合到一起,放进一个runloop中统一管理,以节约性能,而不至于重复性的去修改UI。

这里顺便加上layoutIfNeeded的要点:
如果发现了需要刷新的标记,会立即调用layoutSubview方法去进行布局。
所以我们想要立即刷新的时候,需要这么写

[self setNeedsLayout];
[self layoutIfNeeded];

(三) 为什么替换@synchronize

简单的说,就是@synchronize性能太差了点。而替代者dispatch_semaphore在保证安全的情况下,是性能最高的。

(四)block和delegate的区别

只限于SDWebImage中。
类似于单个图片的下载这种使用次数不多的,可以选择使用block;
如果方法很多,或者想要方法长驻,可以选择delegate方法。

(五)NSMapTable的使用

NSMapTable本身就是可变类型,可以看做是NSMutableDictionary的一种替代。
而NSDictionary对key会进行copy,对value有强引用。
简单来讲,NSMapTable更加灵活。

(六)啥是内联函数

内联函数是C++的一个概念。
我们编写代码的时候会编写各种各样的函数来方便调用。但是,函数调用的本身是会降低程序的执行效率,增加时间和空间方面的开销。因此,对于一些功能简单,规模小且使用频繁的函数,就设计成为了内联函数。
内联函数不是在调用的时候发生控制转移,而是在编译时将函数体嵌入在每一个调用处。
它和宏有着本质上的区别。
宏是在代码处不加任何验证的简单替代,而内联函数是将代码直接插入调用处,而减少了普通函数调用时的资源消耗。
1.内联函数在运行时可调试,而宏定义不可以;
2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;
3.内联函数可以访问类的成员变量,宏定义则不能;

但是有一点要注意,iinline关键字只是表示了一个要求,编译器不一定一定会把inline关键字修饰的函数作为内联函数。

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

推荐阅读更多精彩内容