block的类型

一、block本质是个对象,涉及闭包的概念,用于封装代码

int (^block)(int a,int b) = ^(int a,int b){ return a + b; };

定义: int (^block)(int a,int b)参数: int返回类型 int a 输出参数a(名称可以不写) int b 输入参数b(名称可以不写)实现:^(int a,int b){ return a + b; }; 参数:int a,int b (名称不可缺){}实现

二、block由储存位置不同有的类型,这些类型只有编译器使用
  1. _NSConcreteStackBlock (NSStackBlock) 存储在栈上;
  2. _NSConcreteGlobalBlock (NSGlobalBlock) 存储在程序的代码段;
  3. _NSConcreteMallocBlock (NSMallocBlock) 存储在堆上。
  • 知识提示:C语言中储存有程序代码区(text)、全局区(静态)、常量区、栈区(stack)、堆区(heap,使用malloc)
说明:
  • NSGlobalBlock:在block内部没有引用任何外部变量
  • NSStackBlock:在block内部引用外部变量,处于栈上的block会随栈退出,引用导致崩溃。
  • NSMallocBlock:在其作用域外部使用的指针增加(copy、rerain)

注意:在arc情况下,没有NSStackBlock这个类型,如果有系统自动copy成为NSMallocBlock,同时拷贝代码内部变量如:

  int base = 2;   
  base += 2; // base->4    
  long (^sums)(int,int)  = ^ long (int a,int b){
       return base + a + b; //base->4    
};    
base ++; //base->5    
NSLog(@"%ld",sums(1,2));//输出的结果为 7 arc下提前拷贝base

经典事例,自带答案

三、引用问题:只有NSMallocBlock支持retain、release操作 (老生常谈了具体自己搜吧)
  1. block 内部代码修改数据情况:__block修饰、static
  2. 循环引用的问题:block代码段强引用,使用 __weak typeof (self) weakSelf = self;
  3. block对象被提前释放:不要用__block
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,652评论 18 399
  • 类型分为: _NSConcreteGlobalBlock(全局块) _NSConcreteStackBlock(栈...
    陈雨尘阅读 2,454评论 0 0
  • 在研究block的类型之前,首先我们要知道c类语言的程序编译后在内存中的分布(由高位向低位排序): 栈区:局部变量...
    hanl001阅读 4,155评论 0 2
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,396评论 30 472
  • 转自李峰峰博客 一、概述 闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」...
    Joshua520阅读 4,633评论 0 0

友情链接更多精彩内容