_ _ block修饰变量,这个变量就成为了块变量。
__block修饰的 object变量,在块体内部用到,不会进行retain操作。例:
MyBlock genBlock() {
int a = 3;
__block NSMutableString * myString = [NSMutableString string];
MyBlock inBlock = ^(int n) {
NSLog(@"retain count of string %d",[myString retainCount]);
return n*a;
};
return [inBlock copy] ;
}
int a = 3;
__block NSMutableString * myString = [NSMutableString string];
MyBlock inBlock = ^(int n) {
NSLog(@"retain count of string %d",[myString retainCount]);
return n*a;
};
return [inBlock copy] ;
}
输出结果:
retain count of string 1
如果不加__block关键字,输出结果:
retain count of string 2.
参考文档地址:
http://fei263.blog.163.com/blog/static/9279372420113193523828/
小知识:线程,进程和程序
线程是进程的一部分,进程是程序的一部分。
线程的引入
:例如,有一个Web服务器要进程的方式并发地处理来自不同用户的网页访问请求的话,可以创建父进程和多个子进程的方式来进行处理,但是创建一个进程要花费较大的系统开销和占用较多的资源。除外,这些不同的用户子进程在执行的时候涉及到进程上下文切换,上下文切换是一个复杂的过程。所以,为了减少进程切换和创建的开销,提高执行效率和节省资源,人们在操作系统中引入了"线程(thread)"的概念。
进程的作用和定义
:进程是为了提高CPU的执行效率,减少因为程序等待带来的CPU空转以及其他计算机软硬件资源的浪费而提出来的。进程是为了完成用户任务所需要的程序的一次执行过程和为其分配资源的一个基本单位,是一个具有独立功能的程序段对某个数据集的一次执行活动。
线程和进程的区别
:
1、线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。
2、一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
3、系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,出了CPU之外(线程在运行的时候要占用CPU资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。
4、与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了。
5、进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。
进程与程序的区别 :
程序是一组指令的集合,它是静态的实体,没有执行的含义。而进程是一个动态的实体,有自己的生命周期。一般说来,一个进程肯定与一个程序相对应,并且只有一个,但是一个程序可以有多个进程,
总结 :
线程是进程的一部分,进程是程序的一部分。
原文链接:
http://www.ezloo.com/2007/10/thread_process_program.html
不得不说这篇文章写的不错,我不知道该删掉什么了,所以斗胆转过来了。
2.
Timer dispatch source
定期产生通知(这里我会在后边附上完整的代码。)
Dispatch source的作用:
Dispatch source替代了异步回调函数,来处理系统相关的事件。当你配置一个dispatch source时,你指定要监测的事件、dispatch queue、以及处理事件的代码(block或函数)。当事件发生时,dispatch source会提交你的block或函数到指定的queue去执行
创建dispatch source:
需要同时创建事件源和dispatch source本身。事件源是处理事件所需要的native数据结构,例如基于描述符的dispatch source,你需要打开描述符;基于进程的事件,你需要获得目标程序的进程ID。
配置dispatch source:
对于定时器源,使用 dispatch_source_set_timer 函数设置定时器信息
为dispatch source赋予一个取消处理器(可选)调用 dispatch_resume
定义一个事件处理器来处理事件,可以是函数或block对象
3.
Dispatch Source的内存管理
Dispatch Source也是引用计数的数据类型,初始计数为1,可以使用 dispatch_retain 和 dispatch_release 函数来增加和减少引用计数。引用计数到达0时,系统自动释放dispatch source数据结构。
4。Dispatch Source示例
代码测试过了。麻烦的就是需要大家自己手动抄写了。
原文链接:http://mobile.51cto.com/iphone-306907_2.htm 文章也是很不错的。