IOS每日学习3.29

2018-05-30  本文已影响12人  北你妹的风

创建block的语法。

typedef "返回值类型"  (^blockName)(Param1,Param2);

如果没有返回值,则是

typedef void  (^blockName)(Param1,Param2);

如果没有参数,则是

typedef void  (^blockName)(void);

block访问

block体内访问局部变量,需要加__block关键字,等效于全局变量和静态变量。如果不加

__block关键字,则是copy变量的值

block访问static修饰的变量时,直接读取变量的最新值,而不是在block声明时候的值

为防止循环引用,需要在block引用对象变量的时候加入以下代码

__weak typeof(self) weakSelf=self;

然后早block体里面用weakSelf来访问self里面的属性

block的分类

根据block在内存中位置可以分为三类:NSGloabBlock,NSStackBlock,NSMallocBlock

第一种,不需要在运行时改变行为的block,不需要放在堆或栈上,一个很简单的判别方法就是,是否引用外部变量

第二种,block是在栈上生成的,离开栈的作用域,block就无效了。在MRC环境下,需要手动的进行copy才能脱离栈使用。在ARC下,编译器自动进行copy操作

第三种,block是在堆上生成的,在第二种,copy过之后的block其实就是位于堆上,即变成了NSMallocBlock

上一篇下一篇

猜你喜欢

热点阅读