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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容