http://blog.csdn.net/roverk8y/article/details/18303949
Blcok
1.Java代码说明blcok
就是Java中匿名内部类,而匿名内部类的好处是代码更清晰
例如
button btn = new Button().setListener(newListener(){
// 这里写上监听的代码,这样就可以很直观的观察到这个btn要干啥了
// 例如这里写个发送邮件的代码,这样人们就知道你这按钮是点击后是发 //送邮件的功能
});
而如果不写这种方法你就需要这么写
2.oc代码说明blcok
使用block 的匿名内部方法写
这样就清楚多了
不需要实现委托(实现接口) delegate:selft
不需要分配和释放对象 [alert release]
不需要明确的显示警告对话框 [alertshow]
3 block作用域
和java不同在java匿名内部类里面是不可以访问它外面的代码的,除非你把代码定义为 final
而block 不需要定义final,直接用就ok 的
main(){
intc = 25;
^(int i, int j ) {
NsLog(@”%i”,c);// 这里直接能打印c变量的值,但不能改变也就是c = 19这里不行
}
}
如果非要想改也可以用__block 关键字
main(){
__Block int c = 25;
^(int i, int j ) {
c = 19;
NsLog(@”%i”,c);// 这里就可以改变c = 19的值了
}
}
4.block和函数区别
函数不能定义在其他函数体内,block却可以,他就是一段代码块,而不是函数,但是跟函数是很像的
5.GCD与block
说白了就是在iOS中有一些下载是需要放在后台来做的,这时候就需要异步,而GCD就是用于做异步的
一般移动平台上系统都会有一个专门的检查机制,看程序有没有很长时间被阻塞住,没有回来检查主消息队列。发现这种情况一般都是把程序作为“无响应”干掉。iOS一般情况下是10秒为上限。10秒内程序没有回到主消息循环就被干掉。在前台后台切换时更严格,大概是5秒左右
6.GCD与NSOperationQueue
与GCD一样的还有个NsperationQueue的队列机制(GCD 也是队列),他们的优势在于多核心处理,可以确保一个独立单元在多个处理器上
他们的区别是
1.GCD只支持FIFO(先进先出)队列,而NSOperationQueue可以被重新排序(按优先级排序)
2.如果某个操作需要另一个操作生成的数据,可以让这个操作依赖另一个操作,NSOperationQueue会自动按照顺序正确的执行,而GCD没有这个功能
3. NSOperationQueue兼容KVO,这意味着你可以观察任务的状态。
4.GCD的执行速度是比NSOperationQueue快的,如果你需要性能的话推荐使用GCD这个,而且通常情况下,任务之间是不会相互依赖的,高德纳说过“过早的优化是万恶之源”只有在Instruments显示有必要性能提升的时候才用GCD
关于过早的优化,可以举出fermax gu的installer 页面问题,由于打开页面需要数据,而没有做分页,导致1w条数据在打开页面的时候直接出现加载1w条数据,所以页面打开很慢,而由于是pc 加载1w条数据还是比较快,大概4秒就能开发,所以只是短暂的卡,并没有发现大问题,老大说要优化页面的时候,我说出要找到真正的问题点去优化,而不是到处啥重构,到处瞎优化
7.block优势
如果用于委托的话
1.不需要分配或者释放对象
2.不需要实现委托
3.内部代码块可以访问外部变量
4.减少代码
例如在ios3中实现动画你需要设置一堆参数,大概需要5-6行
而有了block后可以这么写,代码变简单了不是吗?
又例如在遍历代码的字典的时候也可以使用block,不用跟objetForkey什么的打交道了
8.block一般在什么地方能用
对于一个方法,检查当前方法是否存在上下文参数,如果有,那就很有可能会有基于block的等价方法
寻找委托,一般通过委托方法来通知结果的类你可能会找到一个completionHandler
大部分遍历、排序、过滤方法都有基于block的等价方法,array dicitonary string
sttibutedString FileManager都有的