A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 斯芬克斯 中级黑马   /  2016-10-9 22:43  /  1616 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

    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的关键字用来修饰对象变量,声明这是一个弱引用的对象,从而解决了循环引用的问题


2 个回复

倒序浏览
感觉蒙蒙的
回复 使用道具 举报
谢谢分享!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马