读 SDWebImage 六 (编码器三:SDWebImageCodersManager)

SDWebImage 内部实现了一个图片解码/编码的图片编解码器,用于图片的编解码、压缩。其中涉及到编解码管理(SDWebImageCodersManager)、编解码协议(SDWebImageCoder)、PNG/JPEG/TIFF编解码,解压缩,显示大图(SDWebImageImageIOCoder)、GIF编解码(SDWebImageGIFCoder)、WebP编解码(SDWebImageWebPCoder)以及辅助类(SDWebImageCoderHelper

编解码管理( SDWebImageCodersManager

编解码管理器,整体编解码器的入口,该类遵守了 SDWebImageCoder 协议,说明这个类可以提供基本的编解码功能 。编解码器数组是一个优先级队列,也意味着处理多个图片编解码任务时新添加的编解码器将具有最高优先级(即被先调用)

阅读全文

读 SDWebImage 六 (编码器二:SDWebImageCoderHelper 以及动图处理使用到的 SDWebImageFrame)

SDWebImage 内部实现了一个图片解码/编码的图片编码器,用于图片的编解码、压缩。其中涉及到编解码管理(SDWebImageCodersManager)、编解码协议(SDWebImageCoder)、PNG/JPEG/TIFF编解码,解压缩,显示大图(SDWebImageImageIOCoder)、GIF编解码(SDWebImageGIFCoder)、WebP编解码(SDWebImageWebPCoder)以及辅助类(SDWebImageCoderHelper

本篇只做 SDWebImageCoderHelper 类的分析。该类作为辅助类,主要实现了两个功能:动图处理 和 图片方向处理。每个功能有两种方法,均为互逆方法。

阅读全文

读 SDWebImage 六 (编码器一:SDWebImageCoder)

SDWebImage 内部实现了一个图片解码/编码的图片编码器,用于图片的编解码、压缩。其中涉及到编解码管理(SDWebImageCodersManager)、编解码协议(SDWebImageCoder)、PNG/JPEG/TIFF编解码,解压缩,显示大图(SDWebImageImageIOCoder)、GIF编解码(SDWebImageGIFCoder)、WebP编解码(SDWebImageWebPCoder)以及辅助类(SDWebImageCoderHelper

本篇只做 SDWebImageCoder 的分析。 SDWebImageCoder 是编解码协议,包含两个协议:SDWebImageCoderSDWebImageProgressiveCoder,两个协议定义了图片编解码类的接口。

阅读全文

读 SDWebImage 五 (SDWebImageDownloaderOperation)

SDWebImage 的图片下载是由 SDWebImageDownloader 类实现的,该类是一个异步下载管理器。主要工作是下载相关配置项的管理,包括下载队列的先后顺序、最大下载任务数量控制、下载队列中的任务创建、取消、暂停等任务管理,以及其他的 HTTPSHTTP Header 的设置。

阅读全文

读 SDWebImage 四 (SDWebImageDownloader)

SDWebImage 的图片下载是由 SDWebImageDownloader 这个类实现的,该类是一个异步下载管理器。主要工作是下载相关配置项的管理,包括下载队列的先后顺序、最大下载任务数量控制、下载队列中的任务创建、取消、暂停等任务管理,以及其他的 HTTPSHTTP Header 的设置。而真正实现图片下载的是 SDWebImageDownloaderOperation类。该类的 Operation 操作依赖系统提供的NSURLConnection类来实现图片的下载。

阅读全文

读 SDWebImage 三 (SDImageCache)

1、介绍

SDImageCacheSDWebImage 处理图片缓存的类。图片的存储是针对内存和磁盘有一点区别:内存中直接存储图片,磁盘中存中 imagedata
SDWebImageManager 中使用的存储图片、判断图片是否已存储在磁盘/内存等方法均是调用该类中的方法。SDWebImage 设计时做了很好的分工,以至于去分析代码都带有一种享受感。

阅读全文

读SDWebImage 二 (SDWebImageManager)

1、整体框架

看下整体的框架图:
SDWebImage框架
从图中可以更清晰的看出,SDWebImage库是围绕SDWebImageManagerSDWebImageCacheSDWebImageDownloader三个类展开的,而这三个类又是以SDWebImageManager作为核心类。

阅读全文

读 SDWebImage 一 使用分析

SDWebImage整体的框架:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SDWebImage
-
|--SDWebImageCompat :一些兼容性相关的宏定义
|--SDWebImageOperation :只有一个 cancel 方法的 protocal
|
|--Downloader :下载模块
| |-- SDWebImageDownloader
| |-- SDWebImageDownloaderOperation
|
|--Cache :内存和硬盘缓存模块
| |-- SDImageCache
|
|--Utils :
| |-- SDWebImageManager 将缓存和下载模块结合起来使用
| |-- SDWebImagePrefetcher 预下载图片
| |-- SDWebImageDecoder
|
|--Categories : UIKit 相关的Category,方便使用,还支持 MKAnnotationView
|-- MKAnnotationView+WebCache
|-- UIButton+WebCache
|-- UIImageView+WebCache
-
... ...

阅读全文

copy 和 mutableCopy

今天来谈下深浅拷贝【copy 和 mutableCopy】

想写这篇文章,是因为看到了一个有意思的文章,对于其中的一些观点不太认同,所以想简单分析一下深浅拷贝

先看一段代码,稍后会对代码进行分析

1
2
3
4
5
6
7
8
9
-(void)testOne
{
NSArray *test = @[@1,@2,@3];
NSLog(@"test->%p\n",test);
NSArray *testCopy = [test copy];
NSLog(@"testCopy->%p\n",testCopy);
NSArray *testMutableCopy = [test mutableCopy];
NSLog(@"testMutableCopy->%p\n",testMutableCopy);
}

阅读全文

项目总结四

前言:

最近都一直在忙新项目的事,真是倍感身心疲别啊。目前项目终于成型,也算时间宽松渐缓吧,就把项目中遇到的一些问题做个总结。

1、textField限制输入的位数以及小数点的位数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
{
//string就是此时输入的那个字符textField就是此时正在输入的那个输入框返回YES就是可以改变输入框的值NO相反
NSString * toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string];
// 判断是否输入内容,或者用户点击的是键盘的删除按钮
if (![string isEqualToString:@""]) {
if ([textField isEqual:self.textField]) {
// 小数点在字符串中的位置 第一个数字从0位置开始
NSInteger dotLocation = [textField.text rangeOfString:@"."].location;
if (dotLocation == NSNotFound && range.location != 0) {
//没有小数点,最大数值
if (range.location >= 9){
NSLog(@"单笔金额不能超过亿位");
if ([string isEqualToString:@"."] && range.location == 9) {
return YES;
}
return NO;
}
}
//判断输入多个小数点,禁止输入多个小数点
if (dotLocation != NSNotFound){
if ([string isEqualToString:@"."])return NO;
}
//判断小数点后最多两位
if (dotLocation != NSNotFound && range.location > dotLocation + 2) { return NO; }
//判断总长度
if (textField.text.length > 11) {
return NO;
}
}
}
return YES;
}

阅读全文