ios block 类型

网上有很多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

经典事例,自带答案:http://blog.parse.com/learn/engineering/objective-c-blocks-quiz/

三、引用问题:只有NSMallocBlock支持retain、release操作 (老生常谈了具体自己搜吧)

  1、block 内部代码修改数据情况:__block修饰、static

  2、循环引用的问题:block代码段强引用,使用 __weak typeof (self) weakSelf = self;

  3、block对象被提前释放:不要用__block

  

时间: 2024-08-12 19:12:47

ios block 类型的相关文章

iOS中block类型大全

iOS中block类型大全 typedef的block 作为属性的block 作为变量的block 作为方法变量入参的block 作为方法参数的block 无名block 内联函数的block 递归调用的block 作为方法返回值的block 作为函数名的block(太过奇葩,完全不知道怎么用-_-!) iOS中block类型大全,码迷,mamicode.com

iOS block从零开始

iOS block从零开始 在iOS4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调. block的结构 先来一段简单的代码看看: void (^myBlock)(int a) = ^(int a){ NSLog(@"%zd",a); }; NSLog(@"旭宝爱吃鱼"); myBlock(999); 输出结果: 2016-05-03 11:27:18.571 block[5340:706252] 旭宝爱吃鱼

黑马程序员---OC基础8【block类型】【Protocol】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [block类型] 1.block概念 block对象是一个C级别的语法和运行机制,不同之处,它除了有可执行代码以外,它还包含了与堆栈内存绑定的变量 方法的回调 block是一个类型,定义变量,用来存储代码块 2.block基本用法 block与函数很相似,有返回值类型,参数类型,主体: 返回值类型 (^block变量名)(形参列表) = ^(形参列表) { }; 没有参数可以写void,比如:i

写给喜欢用Block的朋友(ios Block)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/38090205 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! 本文不讲block如何声明及使用,只讲block在使用过程中暂时遇到及带来的隐性危险. 主要基于两点进行演示: 1.block 的循环引用(retain cycle) 2.去除block产生的告警时,需注意问题. 有一次,朋友问我当一个对象中的b

黑马程序员-OC加强学习日记-分类、协议、block类型

------- ios培训. android培训.java培训.期待与您交流! ---------- 一.分类  Gategroy 1.创建一个分类 @interface  类名 (分类名) @end @implementation 类名 (分类名) @end 2.特点:(1)扩展已有类的功能 (2)分类中可以访问原有类的成员变量(定义在头文件中的成员变量) 3.语法步骤:(1)创建一个分类 (2)在分类中增加新方法的声明和实现 4.注意点:(1)分类不可以为原有类增加定义成员变量, @prop

(译)IOS block编程指南 1 介绍

Introduction(介绍) Block objects are a C-level syntactic and runtime feature. They are similar to standard C functions, but in addition to executable code they may also contain variable bindings to automatic (stack) or managed (heap) memory. A block ca

IOS block 教程<转>

http://pernghh.pixnet.net/blog/trackback/eac87d412e/33563409 本文来自台湾的某开发人员的博客,被墙,感觉讲的比较易懂,所以引过来.文字简体化了,原来是繁体,变数=变量,这个注意一下. 本章学习目标: 1. 了解何谓block. 2. 了解block的使用方法. Block 是iOS在4.0之后新增的程式语法,严格来说block的概念并不算是基础程式设计的范围,对初学者来说也不是很容易了解,但是在iOS SDK 4.0之后,block几乎

iOS block 机制

本文要将block的以下机制,并配合具体代码详细描述: block 与 外部变量 block 的存储域:栈块.堆块.全局块 定义 块与函数类似,只不过是直接定义在另一个函数里,和定义它的那个函数共享同一个范围内的东西. 访问外部变量 堆块内部,栈是红灯区,堆是绿灯区. 根据块的存储位置,可将块分为全局块.栈块.堆块.这里先主要针对堆块讲解. Block不允许修改外部变量的值.Apple这样设计,应该是考虑到了block的特殊性,block也属于"函数"的范畴,变量进入block,实际就

# iOS Block的本质(三)

iOS Block的本质(三) 上一篇文章iOS Block的本质(二)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block对对象变量的捕获,ARC 环境 block一般使用过程中都是对对象变量的捕获,那么对象变量的捕获同基本数据类型变量相同吗? 查看一下代码思考:当在block中访问的为对象类型时,对象什么时候会销毁? // ARC环境下代码 typedef void (^Block)(void); int main(int argc, const char *