资讯专栏INFORMATION COLUMN

block深入浅出

only_do / 3310人阅读

摘要:的生命周期特别注意堆会持有对象,这样就导致,如果堆不释放的话,其持有的对象也不会释放,这样就会导致循环引用或者延迟释放,所以一般的做法是或宏

typedef void (^Callback)(id result);
- (void)viewDidLoad {
[self callbackDosomething:^(id result) {
NSLog(@"%@",result);
}];

}

- (void)callbackDosomething:(Callback)callback{
callback = [self callbackReDosomething:callback];
}

- (Callback)callbackReDosomething:(Callback)callback{
if (callback) {
callback(@"dosomething");
}
return callback;
}
此处的callback就是用来传递的,在另一个方法里面才callback回调

block是OC对闭包实现的一个对象,为什么说block是对象了,因为在block的数据结构中存在isa指针

1、block分为三种:NSConcreteGlobalBlock、NSConcreteStackBlock、NSConcreteMallocBlock。

第一种block是全局block,如果一个block没有引入外部变量,那么这个block就是全局block,全局block在编译时期就已经确定大小了,如同宏一样;
第二种block是栈block,当引入了外部变量时,这种block就是栈block了,NSConcreteStackBlock内部会有一个结构体__main_block_impl_0,这个结构体会保存外部变量,使其体积变大。而这就导致了NSConcreteStackBlock并不像宏一样,而是一个动态的对象。而它由于没有被持有,所以在它的内部,它也不会持有其外部引用的对象。(注意,栈block是不会持有外部变量的)
第三种block是堆block,堆block就是一个block被copy到堆上,堆block会持有外部引用对象,所以会导致可能的对象延迟释放,或者循环引用的问题。(在MRC下,局部变量如果没有用_block,在block中会对其进行copy操作,而用了_block则只会引用其地址,这也就是为什么改变局部变量需要用_block修饰了)

注意:在MRC和ARC下block的区别
将block作为实例的属性变量时,MRC下需要手动copy到堆中,也就是栈block–>堆block(如果不copy就是栈block,栈block不会持有对象),而在ARC中属性赋值默认是strong,到了block自然就变成了copy,所以在ARC下默认是堆block。

block 的生命周期:
(特别注意:堆block会持有对象,这样就导致,如果堆block不释放的话,其持有的对象也不会释放,这样就会导致循环引用或者延迟释放,所以一般的做法是_weak(ARC)或_block(MRC))

宏:
·#define weak(obj) __weak typeof(obj) weak##obj = obj

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16236.html

相关文章

  • 深入css之去除inline-block元素之间的多余间隙

    摘要:父容器设置优点弹性布局可以去除多余间隙,而且可以轻松的实现垂直居中,水平居中等效果。缺点过低版本的浏览器不支持该属性。 什么是inline-block之间的多余间隙 考虑以下代码: One Two Three nav a { display: inline-block; //或者inline; padding: 5px; background: red; }...

    caspar 评论0 收藏0
  • 【学习笔记】CSS深入理解之vertical-align

    摘要:上例中,左边盒子的基线为其底边缘,右边盒子的基线为的基线将右边盒子的行高设置为,即这个的高度为,位置处于中间。 vertical-align的值 线类:baseline(默认), top, bottom, middle 文字类:text-top, text-bottom 上标下标类:sub, super 数值:1px, 1em - 在baseline对齐的基础上上下偏移一定数值 百分...

    ermaoL 评论0 收藏0
  • 深入理解css之float

    摘要:破坏文档流这是最本质的特性,因此设计的初衷就是破坏文档流。但是也有一种情况是,浮动元素前后并没有内联元素,因此也就不存在行框盒子,这时候就是浮动锚点在起作用。 前言 在css中,是存在流的概念的。在正常情况下,页面总是从左到右,从上到下布局,这种被称为正常的流。但是有很多情况,正常流是没办法实现的,因此我们需要一些手段来破坏流,从而实现一些特殊的布局,而本节的主角float就具备破坏流...

    Nekron 评论0 收藏0
  • 深入清除浮动原理

    摘要:如下图所示可以看到父元素的高度为为了解决这种状况就要清除浮动了。下面详细看一下这两大类清除浮动的方式及原理。所以,避免穿透啊,清除浮动什么的也好理解了。 关于浮动 设置为浮动的元素会脱离当前文档流,向左或向右移动直到边缘遇到另一个浮动元素或者到达边界。普通元素不会对齐造成影响。 浮动是把双刃剑,在给我们的布局带来便利的同时有一些缺点需要我们去解决。例如最常见的父元素塌陷。如下图所示:...

    freewolf 评论0 收藏0
  • 深入清除浮动原理

    摘要:如下图所示可以看到父元素的高度为为了解决这种状况就要清除浮动了。下面详细看一下这两大类清除浮动的方式及原理。所以,避免穿透啊,清除浮动什么的也好理解了。 关于浮动 设置为浮动的元素会脱离当前文档流,向左或向右移动直到边缘遇到另一个浮动元素或者到达边界。普通元素不会对齐造成影响。 浮动是把双刃剑,在给我们的布局带来便利的同时有一些缺点需要我们去解决。例如最常见的父元素塌陷。如下图所示:...

    chnmagnus 评论0 收藏0

发表评论

0条评论

only_do

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<