Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >第三章:持有变量

第三章:持有变量

作者头像
大壮
发布于 2020-04-14 03:21:11
发布于 2020-04-14 03:21:11
52500
代码可运行
举报
文章被收录于专栏:大壮大壮
运行总次数:0
代码可运行

block主要准备分为3个文章记录。 第一章:基础概念和使用 第二章:捕获变量 第三章:持有变量

block可以在内存上存在以下3种形式,不同形式持有变量是不同的。我们先看下如果区分block是栈,堆,还是全局的。

  • _NSConcreteStackBlock,栈,生命周期由系统控制。函数返回后Block将无效;
  • _NSConcreteMallocBlock,堆,生命周期由程序员自己控制。
  • _NSConcreteGlobalBlock,全局,生命周期从创建到应用程序结束。

一.blcok如何区分是在栈,堆,全局

1._NSConcreteGlobalBlock全局
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    __block int value = 20;
    int value1 = 10;
    int (^getBlock)(int num) = ^(int num) {
        //100 + 30 + 10
        return num + value + value1;
    };
    value = 30;
    value1 = 40;
    NSLog(@"getBlock-%d",getBlock(100));

输出结果为:<NSGlobalBlock: 0x10207c798> 没有用到外部变量或者只用了全局变量、静态变量的block都是_NSConcreteGlobalBlock。

2._NSConcreteStackBlock栈

栈上block的定义是:只用到外部局部变量、成员属性变量,且没有强指针引用的block都是StackBlock。 但是在ARC下,很少存在栈上的block。因为很多情况下ARC会主动帮你把block copy一次。 举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    __block int static_k = 3;
    void (^myBlock)(void) = ^{
        static_k++;
    };
    myBlock();
    NSLog(@"%@",myBlock);

在MRC下,输出结果为__NSStackBlock栈。 在ARC下,输出结果为__NSMallocBlock堆。 因为在block在捕获外部变量时ARC会自动帮我们把栈上的block copy到堆上,其中还包括下面的情况系统也会主动copy一次。 1.手动调用copy 2.Block是函数的返回值 3.Block被强引用,Block被赋值给__strong或者id类型 4.调用系统API入参中含有usingBlcok的方法

但并不是说在ARC上就没有栈上的block。其中当Block为函数参数的时候,就需要我们手动的copy一份到堆上了。其中GCD等系统方法中本身带usingBlock的方法,不需要处理。 完整版本请看 https://xiaozhuanlan.com/topic/4196075238

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS block与__block、weak、__weak、__strong
block,本质是OC对象,对象的内容,是代码块。 封装了函数调用以及函数调用环境。
conanma
2021/10/28
2.4K0
iOS面试题-ARC下如何创建栈上的Block
这题主要是考察如何区分栈,堆,还是全局? 其中栈上block的定义:只用到外部局部变量、成员属性变量,且没有强指针引用的block都是StackBlock。 所以
大壮
2020/04/16
1.2K1
《Objective-C-高级编程》干货三部曲(二):Blocks篇
这一章讲解了Block相关的知识。因为作者将Objective-C的代码转成了C++的代码,所以第一次看的时候非常吃力,我自己也不记得看了多少遍了。
用户1740424
2018/07/23
1.1K0
《Objective-C-高级编程》干货三部曲(二):Blocks篇
深入研究Block捕获外部变量和__block实现原理
Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这个新功能“Blocks”。从那开始,Block就出现在iOS和Mac系统各个API中,并被大家广泛使用。一句话来形容Blocks,带有自动变量(局部变量)的匿名函数。
一缕殇流化隐半边冰霜
2018/08/30
1.2K0
深入研究Block捕获外部变量和__block实现原理
Block原理探究(上篇)-Block本质及存储域问题
主要内容: 1.理解Block的本质 2.理解Block的存储域分类 3.理解Block的Copy原理
梧雨北辰
2019/10/08
1K0
关于Block
(1).block种类 全局块(NSGlobalBlock):存在于全局内存中, 相当于单例. 栈块(NSStackBlock):存在于栈内存中, 超出其作用域则马上被销毁. 堆块(NSMallocBlock):在于堆内存中, 是带引用计数的对象, 需要自行管理其内存.
honey缘木鱼
2019/12/16
5130
关于Block
4.Block的类型
类型分为: _NSConcreteGlobalBlock(全局块) _NSConcreteStackBlock(栈块) _NSConcreteMallocBlock(堆块) 栈区(stack):由系统自动分配,一般存放函数参数值、局部变量的值等。由编译器自动创建与释放。其操作方式类似于数据结构中的栈,即后进先出、先进后出的原则。 例如:在函数中申明一个局部变量int b;系统自动在栈中为b开辟空间。 堆区(heap):一般由程序员申请并指明大小,最终也由程序员释放。如果程序员不释放,程序结束时可能会由OS
陈雨尘
2018/06/07
5050
Block那些事
__main_block_func_0这个是block的执行函数,参数是__main_block_impl_0类型。
Helloted
2022/06/07
4390
Block那些事
【iOS】block小记
声明:对某个属性的访问(access)包括getter和setter。以下所说的访问是指setter。
VV木公子
2018/06/05
5.4K0
Block
通过clang -rewrite-objc WYTest.m命令编译该.m文件,发现该block被编译成这个形式:
conanma
2021/10/28
5940
iOS中的Block
利用typedef给block起别名,和指向函数的指针一样,block变量的名称就是别名
xy_ss
2023/11/22
2310
iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)
【摘要】这篇文章,首先在第1节中介绍Block的定义,以及与C里面函数的对比。然后,第2节介绍实际开发中经常会用到的Block语法形式,以供读者日后查阅。只知道怎么用却不知什么时候用?所以随后的第3节将介绍Block的应用场景。然而,用Block不当导致了Crash?所以,第4节有必要了解Block捕获变量的特性,以及循环引用的解决。另外,千万不要懒,一碰到Block就weak,要区分哪些不会引起循环引用。然而,如果对Block的内存机制不熟悉,也会导致Crash,所以第5节会介绍Block的内存机制。学到这里已经够用了。然而,你却想进一步了解Block的实现机制?第6节将简单介绍下clang的编译与Block的实现及其原理。
陈满iOS
2018/09/10
1.9K0
iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)
iOS 进阶之 Block 的本质及原理
相信稍微有点开发经验的开发者,应该都对 block 有一定的了解。刚开始使用 block 的时候,可能觉得很方便。知道怎么去用,但是知其然知其所以然的态度来分析一下 block 的原理和内部结构是什么。
网罗开发
2021/01/29
6840
iOS 进阶之 Block 的本质及原理
iOS block的一些理解和注意点
block的定义:带有自动变量(局部变量)的匿名函数。 一.block作为参数使用时应该使用copy来修饰。 原因1:当用weak,assign修饰block属性时,block访问外部变量,此时block的类型就是栈(stack)block。保存在栈中的block,当block所在函数方法返回结束,该block就会被销毁。在其他方法内部调用该block,就会引发野指针错误EXC_BAD_ACCESS。 原因2.当使用copy,strong修饰block属性时,block访问外部变量,此时block的类型时堆
大壮
2018/06/19
1.2K0
【IOS开发高级系列】Block专题
http://blog.devtang.com/blog/2013/07/28/a-look-inside-blocks/
江中散人_Jun
2023/10/16
3230
【IOS开发高级系列】Block专题
老司机出品——源码解析之从Block说开去
近来把《iOS与OS X多线程和内存管理》这本书又掏出来看了一遍,这本书前前后后加起来看了能有三四遍了,每次看都有新的理解。现在就把个人对Block的一些理解记录下来。
老司机Wicky
2018/08/22
4680
老司机出品——源码解析之从Block说开去
iOS-从循环引用看Block
说明:在block区内已经释放,到self.block()调用时已经被释放,所以值为null。
Wilbur-L
2020/12/15
1.2K0
iOS-从循环引用看Block
iOS_理解Block(代码块)+底层实现
​ Block是对象,可以赋值,当参数,也可以放入Array和Dictionary中,可以retain和release。Block用“^”符号来表示,后面跟一对花括号,括号里是Block的实现代码。例如,下面就是一个简单的Block:
mikimo
2022/07/20
6250
iOS_理解Block(代码块)+底层实现
Block 详解
闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」;Block 是 Objective-C 对于闭包的实现。
猿_人类
2019/08/20
1.1K0
block与GCD--37:块
全局的静态 block:NSConcreteGlobalBlock,不会访问任何外部变量。 栈中的 block:NSConcreteStackBlock,当函数返回时会被销毁。 堆中的 block:NSConcreteMallocBlock,当引用计数为 0 时会被销毁。
xy_ss
2023/11/22
1370
block与GCD--37:块
相关推荐
iOS block与__block、weak、__weak、__strong
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档