黑马程序员技术交流社区

标题: Block!Block!Block! [打印本页]

作者: 斯芬克斯    时间: 2016-10-9 22:43
标题: Block!Block!Block!
    block本身封装了一段代码,并将这段代码当做变量,通过block()的方式进行回调。
   block的几个特点:
1.block的代码是内联的,效率高于函数调用
2.block对于外部变量默认是只读属性
3.block被Objective-C看成是对象处理
对于block的底层实现在网上已经有很多资料了,其源码更是可以在opensource.apple.com上下载。

block特性:
捕获外界变量
block还可以访问外界的局部变量,在我的从UIView动画说起中有这么一段代码,其中block内部使用到了外部的局部变量:
     CGPoint center = cell.center;
     CGPoint startCenter = center;
     startCenter.y += LXD_SCREEN_HEIGHT;
     cell.center = startCenter;
     [UIView animateWithDuration: 0.5 delay: 0.35 * indexPath.item usingSpringWithDamping: 0.6 initialSpringVelocity: 0 options:             UIViewAnimationOptionCurveLinear animations: ^{
            cell.center = center;
     } completion: ^(BOOL finished) {
    NSLog("animation %@ finished", finished? @"is", @"isn't");
}];

这里面就用到了void(^animations)(void)跟void(^completion)(BOOL finished)两个block,系统会在动画开始以及动画结束的时候分别调用者两个block。在实现动画的block内部,代码访问了上文中的center属性——在动画开始的时候这个动画函数的生命周期早已结束,而block会捕获代码外的局部变量,当然这只局限于只读操作。如果我们在block中修改外部变量,编译器将会报错。

循环引用
block在iOS开发中被视作是对象,因此其生命周期会一直等到持有者的生命周期结束了才会结束。另一方面,由于block捕获变量的机制,使得持有block的对象也可能被block持有,从而形成循环引用,导致两者都不能被释放,用__weak的关键字用来修饰对象变量,声明这是一个弱引用的对象,从而解决了循环引用的问题



作者: 邱中林    时间: 2016-10-9 23:27
感觉蒙蒙的
作者: bjwqcpy@126.com    时间: 2016-10-10 23:14
谢谢分享!




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