block截获的自动变量

作者: iOS腾蛟起凤 | 来源:发表于2016-06-14 11:01 被阅读463次

很简单,分两种情况。

第一种情况,该变量没有__block修饰。此时block截获的是block定义处对该变量的一份瞬时拷贝,此后block外的这个变量与block内截获的拷贝相互独立,再没有半毛钱关系。变量值改变不会影响拷贝的值,也就是说block执行时使用的是当时拷贝的值。如果试图在block内对该拷贝进行赋值,编译器会报错。

执行结果:

试图对拷贝的量赋值会报错

第二种情况,该变量有__block修饰。此时block截获的是该变量的真身。block执行时使用的是执行时该变量的值,而不是block定义时该变量的值。可以在block内改变该变量的值,而且是实实在在地改变了该变量的值。

执行结果:

注意一个变量表示的是对象时,该变量的值实际上是指针值。若没有__block修饰,则可以通过该指针值改变其指向的对象,但是不能改变该指针的值。若有__block修饰,则既可改变对象值,也可改变指针值。

block在一个类里面定义时,可以对类的实例变量随意赋值,即便实例变量没有__block修饰,因为block截获的实例变量前省略了self,block捕获的实际是self指针。

另外,block不能截获C语言数组。试图截获数组会报错。数组与指针联系密切,尽量将变量定义为指针,而不要定义为数组。

相关文章

  • Block(匿名函数)

    一、语法格式 二、截获自动变量值和__block修饰符 block的自动变量截获只针对block中使用的自动变量。...

  • __block

    __ block Block中所使用的被截获自动变量就如“带有自动变量值的匿名函数”所说,仅截获自动变量的值,Bl...

  • Block实现原理

    Block是带有自动变量值的匿名函数; 带有自动变量值在Block中表现为截获自动变量值; 自动变量值截获只能保存...

  • Blocks

    简述 Blocks:带有自动变量(局部变量)的匿名函数。 函数指针与Block 对变量的截获 所谓截获自动变量值意...

  • iOS block详细知识点

    Block与外界变量 1、截获自动变量(局部变量)值 (1)默认情况 对于 block 外的变量引用,block ...

  • iOS面试题:一个int变量被__block修饰与否的区别?

    更多:iOS面试题大全 1、block截获自动变量(局部变量)值 对于 block 外的变量引用,block 默认...

  • iOS Block学习笔记(五) -- Block截获静态变量(

    上一节分析了Block截获int, char*类型自动变量的源码, 发现Block内部用成员变量的形式保存了被截获...

  • IOS Block 你需要知道的15个重点内容

    1.Block 中的变量 会被block截获 保存该自动变量的瞬间值,所以在block中改写该自动变量的值也不会影...

  • 第二章 2.2.5 截获的自动变量

    上两节截获自动变量值与__block说明符,在Block中将值赋值给截获的外部基础类型的自动变量,就会产生编译错误...

  • iOS Block理解

    1、什么是Block 2、Block语法 3、Block类型变量 4、截获自动变量值 5、__block说明符 6...

网友评论

    本文标题:block截获的自动变量

    本文链接:https://www.haomeiwen.com/subject/mvisrttx.html