ARC和MRC下Block的使用注意

本文介绍了Block的基础知识,包括其作为代码块、数据类型和匿名函数的特性,以及在ARC和MRC环境下的存储位置。在ARC下,编译器会根据特定情况自动将Block复制到堆区;而在MRC下,需要手动管理Block的内存。Block类型的三种状态(全局、栈、堆)以及__block修饰符的作用也在文中详细阐述,特别是如何允许在Block内部修改外部变量。
摘要由CSDN通过智能技术生成

Block

1.是一段代码块,只在被调用的时候执行(类似于方法和函数)

2.是一种数据类型(类似于’int’,’NSString’)

3.可以定义成临时变量

4.可以当做参数传递

5.可以定义成属性

6.是一种匿名函数(重要,只有函数体,没有函数名)

7.是一个指向函数的指针(一个指针对象,block的名字就是指针的地址)

8.因为block代码块的内部没有修改和访问外部的变量,所以函数体不会发生变化,就像NSString一样,定义的变量都保存在常量区,不会随着定义的数量而增大空间的开辟,所以定义多个相同的代码块也一样,都会保存在常量区,前提是定义的代码块内部不发生改变

9.只要代码块的函数体不发生变化,无论是ARC还是MRC它的存储区域是一样的,都是常量区

10.当代码块函数体发生变化的时候,例如访问或者修改外部变量

int num = 10;

void(^block)() = ^{

NSLog(@"%d",num);

};

NSLog(@"%d",block);

 如果是ARC(一般都会自动)在堆区 NSMallocBlock

  在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上的几种情况?

  • 1.block作为函数返回值时
  • 2.将block赋值给__strong指针时
  • 3.block作为Cocoa API中方法名含有usingBlock的方法参数时
  • 4.block作为GCD API的方法参数时

 如果是MRC(手动)在栈区 NSStackBlock 

11.block属性为什么要使用copy?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值