Block 原理

iOS block原理详解 block本质 block底层就是一个struct __main_block_impl_0类型的结构体,这个结构体中包含一个isa指针,本质上是一个OC对象 block是封装了函数调用以及函数调用环境的OC对象 block底层结构 block底层结构就是__main_block_impl_0结构体,内部包含了impl结构体和Desc结构体以及外部需要访问的变量,block将需要执行的代码放到一个函数里,impl内部的FuncPtr指向这个函数的地址,通过地址调用这个函数,就可以执行block里面. 阅读详情
int main(int argc, char * argv[]) {
    @autoreleasepool {
        void (^block)(void) = ^{
            NSLog(@"Hello World!");
        };
        block();
        //return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}




struct __main_block_impl_0 {
  struct __block_impl impl;
  struct __main_block_desc_0* Desc;
  __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) {
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {

            NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_ypjn15q54cq9gp_xnd9wcvt40000gn_T_main_d00a24_mi_0);
        }

static struct __main_block_desc_0 {
  size_t reserved;
  size_t Block_size;
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)};


int main(int argc, char * argv[]) {
    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; 
        void (*block)(void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA));
        ((void (*)(__block_impl *))((__block_impl *)block)->FuncPtr)((__block_impl *)block);

    }
}
static struct IMAGE_INFO { unsigned version; unsigned flag; } _OBJC_IMAGE_INFO = { 0, 2 };

一 、block 原理

block 定义:定义调用了block 的构造函数 __main_block_impl_0, 传参__main_block_func_0,将 __main_block_func_0 方法地址传给 block 的 FuncPtr,相当于 block 记录了方法指针。

block调用:直接调用 FuncPtr。

 

二、Block的几种形式

  • 分为全局Block(_NSConcreteGlobalBlock)、栈Block(_NSConcreteStackBlock)、堆Block(_NSConcreteMallocBlock)三种形式

    其中栈Block存储在栈(stack)区,堆Block存储在堆(heap)区,全局Block存储在已初始化数据(.data)区

1、不使用外部变量的block是全局block

比如:

    NSLog(@"%@",[^{
        
    } class]);

输出:

__NSGlobalBlock__

2、使用外部变量并且未进行copy操作的block是栈block,copy 了是 堆block。

3、block 成员变量 默认拷贝到堆。
 

c语言block内部的实现原理,Block原理分析详解 1 基本说明Block一直是OC的一个重点、难点、黑科技。Block在日常项目中经常使用,他的实现方式和一般的oc代码不一样。同时也很容易出现使用不慎的情况。我们知道OC的本质是C语言+runtime。runtime中的具体实现完全就是汇编加上C语言。而且我们发现大部分都是通过结构体实现的。我们可以通过clang -rewrite-objc main.m这种命令把包含Block的main.m函数反... 阅读详情

相关推荐

block实现原理

iOS开发,block实现原理。深入讲解block实现原理以及讲解与内存管理之间的联系。

Block 本质、实现原理、内存管理、循环引用、__block等

一、Block介绍 1.1概念: 将函数及其执行上下文封装起来的对象 底层用struct实现 1.2block实现原理: a .新建项目 代码放入file.m中 b.打开终端cd到项目目录下 c.敲clang -rewrite-objc file.m查看编译后的文件内容 本质是将OC重写为C后目录下多了个file.cpp文件 1)Block实际上是OC对于闭包(闭包是一个函数或指向函数的指针,再加上该函数执行的外部的上下文变量。)的实现。OC是对C语言的扩展,block的实现是基于函数和指向函数的

idealPC的专栏 2329

条件风险价值CVaR内容介绍(MATLAB例程)

在对微电网优化调度过程中,由于新能源机组出力和负荷的不确定性,若采用确定性的优化调度方案会存在一定的风险。反之,若风电和光伏输出功率的实际值高于预测值时,则需要降低可控机组出力或者弃风弃光,这都会给系统带来运行费用增加的风险。下,损失超过VaR值时的条件均值[1]。VaR是指在一定的置信水平下,某一投资组合在未来某一时间段内的最大损失。为m维决定系统风险损失的随机向量f(y)为y的概率密度函数。式中,m为所有场景的数量,yk为第k个场景下随机变量的值,为第k个场景发生的概率。的最小值即为CVaR,对应的。

贾贾的博客 3057

block原理

block原理 block的本质是一个结构体,包含引用的外部变量及一个需要执行的函数的函数指针,在内存中可以有三个位置,即堆上、栈上和全局区(静态区)。当block中没有引用外部变量时,block的位置在全局区,当block中访问外部变量时,MRC下block默认在栈区,ARC下block默认会从栈区复制到堆区。 另外,block在生成对应的结构体时,如果引用的外部变...

weixin_30757793的博客 421

从临床试验到互联网AB测试:边缘结构模型(MSM)如何解决‘时依性混杂’这个老大难问题

本文探讨边缘结构模型(MSM)如何解决时依性混杂问题,适用于临床试验和互联网AB测试。通过逆概率加权(IPTW)等方法,MSM能有效剥离混杂效应,准确评估长期干预效果。文章结合跨领域案例,详细解析MSM的核心原理、实施步骤及在推荐算法效果评估中的实战应用,帮助读者掌握这一先进因果推断工具。

weixin_28725949的博客 206

Windows服务器SSL漏洞修复实战:如何一键禁用TLS 1.0/1.1避免SWEET32攻击

本文提供了Windows服务器修复SWEET32漏洞的实战指南。通过组策略编辑器,详细讲解如何一键禁用不安全的TLS 1.0/1.1协议,并优化密码套件顺序,以消除由3DES等弱加密算法带来的安全风险。文章还涵盖了应对SQL Server等应用兼容性挑战的解决方案,以及企业级批量部署的脚本化方法,帮助管理员系统性地提升服务器TLS/SSL安全配置。

weixin_29310631的博客 244

从零部署思澈科技SiFli-Solution:避坑指南与实战排错

本文详细介绍了从零部署思澈科技SiFli-Solution开发环境的完整流程与实战排错指南。重点解析了Keil uVision5版本选择、Butterfli工具路径配置等关键步骤,并针对Keil路径报错、函数冲突等高频问题提供了具体解决方案,帮助开发者高效避坑,快速搭建稳定的嵌入式开发环境。

devops8pract的博客 529

Block 的原理

1.Block的本质是一个结构体指针, 回调原理: 通过当前的block对应的结构体指针找到对应的结构体,然后在结构体中找到对应的函数名称, 最后调用函数 . 2.通过__block \ static \ 全局变量 修饰或定义的变量,传入到 block 对应的结构体中实质时传入了对应的变量地址& a, 所以修改变量后block 内部的变量也随着响应的改变.  3.局部静态变量则传入的是实际的值

pengplay的博客 734

如何使用VNC对openEuler系统进行远程图形化操作

本文详细介绍了在openEuler系统中配置VNC远程图形化操作的方法。主要内容包括:1)服务端配置:安装GNOME图形界面和TigerVNC服务,创建VNC用户并设置密码,配置VNC服务启动脚本;2)客户端连接:使用VNC Viewer等工具连接服务器;3)常见问题解决方法。通过5901端口建立连接后,用户可远程操作openEuler图形界面,适用于需要图形化管理的场景。

2501_93651177的博客 313

华为od 面试八股文_前端_02_含答案

华为od 面试八股文_前端_02_含答案

MISAYAONE的博客 1997

Block原理,为什么block能捕获变量 -- 原理篇

主要参考了这些文章 , 有删改: http://www.jianshu.com/p/ee9756f3d5f6 https://www.jianshu.com/p/c99f4974ddb5 https://www.jianshu.com/p/8865ff43f30e 前言 Blocks是C语言的扩充功能,而Apple 在OS X S...

gcs的博客 1万+

触摸芯片RM1015B基本使用方法

RM1015B触摸芯片使用指南:该芯片采用4通道设计(实际使用3通道),通过I2C接口通信(设备地址0x2B)。硬件设计需注意中断/复位引脚复用,需上拉处理。软件配置包括初始化、中断处理和定时器扫描,通过设置各通道阈值(0-300W)调节灵敏度,值越小越灵敏。调试时可调用rm1015B_debug_func()输出波形数据。典型应用场景包括接近检测和手势识别,中断触发后需在8ms内响应。特别注意不同通道的寄存器映射关系及校准流程,确保检测准确性。

云淡风轻 176

「iOS」————Block的底层原理

本文深入解析了Objective-C中Block的底层实现机制。Block实际上是一个结构体对象,包含isa指针,标志位和函数指针等核心元素。还讲解了iOS与引用计数相关的内容

2301_80253909的博客 1378

数据结构之博弈树搜索(深度优先搜索)

数据结构之博弈树搜索(深度优先搜索)

LucianaiB的博客 1523

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Block原理、变量截获、三种形式、Block中weak/strong self的用法

Block原理、变量截获、三种形式、Block中weak/strong self的用法前言1、Block的原理2、变量截获1、局部变量截获是`值`截获2、局部静态变量截获是`指针`截获。3、全局变量,静态全局变量截获:`不截获,直接取值`。4、__block修饰变量截获是`指针`截获。3、Block的3种形式1、不使用外部变量的block是全局block2、使用外部变量并且未进行copy操作的block是栈block,`日常开发常用于这种情况`。3、对栈block进行copy操作,就是堆block,而对全局

烈马痴情葱的博客 765

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OC block底层实现原理

先看两个实例 1、 typedef void(^captureObjectBlock)(void); captureObjectBlock testBlock; - (void)viewDidLoad { [super viewDidLoad]; [self captureObject]; testBlock(); } - (void)captureObject {...

JinManli的博客 1601

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Block原理

原文链接Block原理 Block的实质 我们先写一个最基础的Block int main(int argc, const char * argv[]) { void (^testBlock)(void) = ^{ printf("asddasd"); }; testBlock(); return 0; } 复制代码接着我们使用clang将...

weixin_33806509的博客 266

iOS中Block的底层原理

本文作者主要参考Kazuki Sakamoto,Tomohiko Furumoto著,黎华译的《Objective-C高级编程:iOS与OS X多线程和内存管理》一书。在平时工作中遇到不少关于Block的相关困惑,比如:Block的循环引用问题。于是在反复阅读了该书籍后,决定总结一篇关于Block的相关文章。如果还想深入了解Block,作者建议直接阅读上述书籍。由于作者水平有限,文章难免存在纰漏,恳求各位读者不吝赐教。

weixin_44758107的博客 636

Block的实现原理

Block的实现原理这篇是记录根据网上的文章进行的实际操作。C函数的生成中间编译代码的编译方法是clang -rewrite-objc xxxx.c。由于编译文件中内容较多,这里我们只截取有关block的部分。首先,看看没有block的C函数以及编译后的结果:#include <stdio.h>int main(){ return 0; }编译代码中的block:这里我们可以看到一个bloc

寒流的专栏 3160

iOS进阶 - Block底层原理

iOS进阶 - Block底层原理 一 block的本质 1 block本质上也是一个oc对象,它内部也有一个isa指针 2 block是封装了函数调用以及函数调用环境的oc对象 3 block的底层结构 Block源码转换查看 block在实际编译时无法转换成我们能够理解的源代码,但可以通过clang(LLVM编译器)转换成可读的源代码,步骤如下: 1打开终端,输入cd 把要转换的文件拖到终端,然后回车进入要转换文件的目录; 2输入命令clang -rewrite-objc main.m -o main.

qq_20461469的博客 314

【iOS开发】Block 核心原理

目标: 熟悉Block底层原理 内存拷贝相关的知识 如何深入学习相关概念呢? 将OC代码转化成C++代码,查看其内部实现。 面试过程中,每道题都是有对应分数的,一定要尽可能答的漂亮。 什么是Block 常见面试题: 什么是Block? 你对Block的调用是怎么理解的? 截获变量是Block的一大特性,系统对于Block的截获是怎么实现的呢? 我们添加__block修饰符做什么事情呢? 什么时候需要对Block 进行一个copy操作,栈Block和堆Block是否了解呢? 6.Block的循环引用 1.

Steve_Abelieve 294

iOS Block 底层原理

Block 结构体写法 struct __block_impl { void *isa; int Flags; int Reserved; void *FuncPtr; }; struct __main_block_impl_0 { struct __block_impl impl; struct __main_block_desc_0* Desc; int ag...

Coder 794

Block实现原理

iOS中block实现的探究 分类: iOS 职业 | 工作 2012-07-17 20:23 61205人阅读 评论(25) 收藏 举报 ioslambda编译器apple语言python 目录(?)[+] [0. Brief introduction of block] Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对

帅帅的专栏 1122
上一篇: 获取当前显示viewcontroller
下一篇: iOS 文章收藏
攻城狮Corn
博客等级 码龄12年 2粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值