block

  1. block是匿名函数
  2. 经典面试题
    int val = 10; void (^blk)(void) = ^{ printf("val=%d\n",val);
    };
    val = 2;
    blk();输出10,原因block在实现的时候就捕获外部变量,是copy一份,不改变原来的数值。

如果想要block内部想要改变外部的变量,就要用__block来修饰。

3.block循环引用问题
为什么使用类方法,不会循环引用,因为self 没有包含这个方法
如果非要block里面引用self,那么 _weak typedef weakself=self;

重要还是看有没有相互持有,注意:block里面对self的引用

4.block分类

根据Block在内存中的位置分为三种类型:

NSGlobalBlock是位于全局区的block,它是设置在程序的数据区域(.data区)中。

NSStackBlock是位于栈区,超出变量作用域,栈上的Block以及 __block变量都被销毁。

NSMallocBlock是位于堆区,在变量作用域结束时不受影响。

注意:如果不想让block被释放的话,就copy一下吧

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容