objective-c Block

Block是一种比较特殊的苹果官方推荐使用的数据类型,应用场景广泛

  • 动画
  • 多线程
  • 集合遍历
  • 网络请求回调
    作用:用来保存某一段代码,可以在恰当的时候取出来调用,功能类似于函数
格式
返回值类型 (^block变量名)(形参列表) = ^{

};
//声明Block变量,
type (^BlockName) (type, type);
BlockName = ^(type name1, type name2){

};

//调用
BlockName(name1,name2);

先借用typedef给Block定义一个变量名


应用场景
  1. 当发现代码前面和后面一样的时候,可以使用Block
void fun(^BlockName())
{
    NSLog(@"1");

    BLockName();

    NSLog(@"3");
}

void fun1()
{
    fun(^{NSLog(@"3");});
}
打印:1
     2
     3

注意:

  1. Block可以访问外部变量
  2. Block可以定义和外界定义的变量,如果有和外面同名的变量,在Block中访问的是Block的变量
  3. 默认情况下,不可以在Block中修改外界变量的值
  • 因为Block中的变量和外界的变量不是同一个变量

  • Block访问到了外界的变量,Block会将外界的变量拷贝一份到堆内存中

  1. 如果加上__block之后就是地址传递,所以可以在Block中修改外界的值
  2. 默认情况下Block储存在栈中,如果Block进行一个copy操作,Block会转移到堆中
  3. 如果Block在栈中,访问了外界的对象,那么不会对对象进行retain操作
  4. 如果Block在堆中,Block中访问了外界的对象,那么会对外界对象进行一次retain
  5. 如果在Block中访问了外界对象,一定要个对象加上__block,只要加上了__block,Block在堆中也不会对对象进行retain

你可能感兴趣的:(objective-c Block)