黑马程序员技术交流社区

标题: oc中的block [打印本页]

作者: allen0206    时间: 2014-10-18 12:23
标题: oc中的block
一,
1,block的声明格式:
返回值类型(^block的名字)(参数类型1,参数类型2,.......)
2,block的定义格式
^返回值类型(参数类型1 参数名,参数类型2 参数名.......){return 返回值类型;}
3,一般来说,在block内只能读取在同一个作用域的变数而且没有办法修改在block外定义的任何变数,此时若我们想要这些变数能够在block中被修改,就必须在前面挂上__block的修饰词
二,blocks的应用
1,用作多线程的代码单元(GCD),多核并行编程。
2,用作某个函数调用完成后的回调函数。如UIView动画,Notification。
  Block作为回调函数比传统回调函数的优越性:
   在函数调用的时候,将block作为一个参数传递,使得代码紧凑,结构清晰。
例如:
block之前,
- (void)viewDidLoad {
   [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(keyboardWillShow:)
        name:UIKeyboardWillShowNotification object:nil];
}
- (void)keyboardWillShow:(NSNotification *)notification {
    // Notification-handling code goes here.
}
block之后,
- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification
         object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) {
             // Notification-handling code goes here.
    }];
}
3,允许访问本地变量,这样可以避免通过结构体将本地变量封装后传递给回调函数。最为典型的就是异步数据下载后,更新ui。
NSString* parameter = [self getSomeParameter];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{NSString* result
= [self fetchResultFromWebWithParameter:parameter];
dispatch_async(dispatch_get_main_queue(), ^{[self updateUIWithResult:result]; // 能直接使用上层block中的变量result,只读的。所以说可以直接使用局部变量});
});
五,Blocks的内存管理
上面提到,block是分配在栈上的,它也可以跟其他的对象一样retain,release;有时,我们需要延长block的生命周期,可以使用Block_copy(block)将block变量拷贝到heap上
[block1 copy] 后,原先分配在stack上的__block 变量 shared 别移动了heap上;
对于copy到heap中的block 再copy时,行为同普通对象retain一样,会使引用计数+1

20130830170027375.png (96.89 KB, 下载次数: 0)

20130830170027375.png

作者: 弹琴骚年    时间: 2014-10-18 21:18
内容挺好的。。就是字的颜色。。亮瞎了我。:)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2