树下的老男孩

工匠之行,在行动中体悟修行的乐趣


  • 首页

  • 技术

  • 其它

  • 归档

iOS block浅析

发表于 2015-05-21   |   分类于 tech   |     |   阅读次数

iOS开发中经常会使用block结合gcd来完成多线程编程,block也属于对象,主要有三种类型:
1、 _NSConcreteStackBlock ,存储在栈上;
2、_NSConcreteGlobalBlock,存储在程序的数据区域(text段);
3、_NSConcreteMallocBlock,存储在堆上。
下面分别介绍一下这三种类型的block,block在arc和非arc的模式下会有些需要注意的地方:

  • NSGlobalBlock:在block内部没有引用任何外部变量
1
2
3
4
void (^globalBlock) () = ^ () {
NSLog(@"global block");
};
NSLog(@"%@", globalBlock);//<__NSGlobalBlock__: 0x1096e20c0>

对NSGlobalBlock的retain、copy、release操作都无效。

  • NSStackBlock:在block内部引用外部变量
    先讨论下MRC模式:
阅读全文 »

iOS持续集成:命令行创建工程

发表于 2015-05-19   |   分类于 tech   |     |   阅读次数

  在开发iOS应用的时候,大部分都是直接采用Xcode进行开发,但有时候需要用命令行来创建工程,比如最近在做ci的持续集成,就只能通过命令行的方式,这时候就需要了解一下工程文件的构成。我们知道工程文件的相关信息保存在project.pbxproj,因此可以通过脚本创建出pbxproj文件,完成基础工程的创建。

pbxproj

  下面介绍一下pbxproj文件,可以拖动.xcodeproj文件到文本编辑器,如sublime,查看pbxproj文件的组成方式,主要包括:

  • PBXBuildFile PBXFileReference
    这两个section保存中工程文件相关的信息:包含文件的类型,路径,名称等
1
2
3
4
5
6
7
/* Begin PBXBuildFile section */
F60CC2A114D4EA0500A005E4 /* SocketOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = F60CC2A014D4EA0500A005E4 /* SocketOperation.m */; };
/* End PBXBuildFile section */

/* Begin PBXFileReference section *
F60CC2A014D4EA0500A005E4 /* SocketOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SocketOperation.m; sourceTree = "<group>"; };
/* End PBXFileReference section */
阅读全文 »

SDWebImage源码剖析(二)

发表于 2015-05-10   |   分类于 tech   |     |   阅读次数

SDWebImageCache管理着SDWebImage的缓存,其中内存缓存采用NSCache,同时会创建一个ioQueue负责对硬盘的读写,并且会添加观察者,在收到内存警告、关闭或进入后台时完成对应的处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- (id)init {
_memCache = [[NSCache alloc] init];
_ioQueue = dispatch_queue_create("com.hackemist.SDWebImageCache", DISPATCH_QUEUE_SERIAL);
//收到内存警告时,清除NSCache:[self.memCache removeAllObjects];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(clearMemory)
name:UIApplicationDidReceiveMemoryWarningNotification
object:nil];
//程序关闭时,会对硬盘文件做一些处理
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(cleanDisk)
name:UIApplicationWillTerminateNotification
object:nil];
//程序进入后台时,也会进行硬盘文件处理
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(backgroundCleanDisk)
name:UIApplicationDidEnterBackgroundNotification
object:nil];
}
阅读全文 »

SDWebImage源码剖析(-)

发表于 2015-05-10   |   分类于 tech   |     |   阅读次数

  在开发项目的过程中会用到很多第三方库,比如AFNetWorking,SDWebImage,FMDB等,但一直都没去好好的研究一下,最近刚好项目不是太紧,闲下来可以给自己充充电,先研究一下SDWebImage的底层实现,源码地址:SDWebImage
  先介绍一下SDWebImage,我们使用较多的是它提供的UIImageView分类,支持从远程服务器下载并缓存图片。自从iOS5.0开始,NSURLCache也可以处理磁盘缓存,那么SDWebImage的优势在哪?首先NSURLCache是缓存原始数据(raw data)到磁盘或内存,因此每次使用的时候需要将原始数据转换成具体的对象,如UIImage等,这会导致额外的数据解析以及内存占用等,而SDWebImage则是缓存UIImage对象在内存,缓存在NSCache中,同时直接保存压缩过的图片到磁盘中;还有一个问题是当你第一次在UIImageView中使用image对象的时候,图片的解码是在主线程中运行的!而SDWebImage会强制将解码操作放到子线程中。下图是SDWebImage简单的类图关系:

阅读全文 »
1…34
树下的老男孩

树下的老男孩

28 日志
2 分类
15 标签
© 2015 - 2016 树下的老男孩 | 本站总访问量次
由 Hexo 强力驱动
主题 - NexT.Pisces