浅谈iOS之Block

利用图层自动识别算法实现CAD到Revit BIM模型的高效转换 - VS2022与AutoCAD2024开发环境配置指南 本文详细介绍了如何配置VS2022与AutoCAD2024开发环境,并利用图层自动识别算法实现CAD图纸到Revit BIM模型的高效自动化转换。通过解析CAD图层的规律性,该算法能智能识别并分类墙、门、窗等构件,提取几何信息并驱动Revit自动创建三维模型,从而将传统繁琐的人工“翻模”工作转化为高效、准确的自动化流程,大幅提升BIM模型创建效率。 阅读详情

前言

iOS 4.0版本中,块不包含Objective-C中的新编程发现。 它们也存在于其他编程语言中(例如Javascript)和其他名称,例如Closures。 在iOS中,它们首次出现在4.0版本中,从那时起它们就已经被广泛接受和使用。 在随后的iOS版本中,Apple重新编写或更新了许多框架方法,因此它们采用了块,而且块似乎部分是代码编写方式的未来。 但他们到底有什么关系呢?

块是添加到C,Objective-C和C ++的语言级功能,它允许您创建不同的代码段,这些代码段可以传递给方法或函数,就像它们是值一样。 块是Objective-C对象,这意味着它们可以添加到NSArray或NSDictionary等集合中。 它们还能够从封闭范围中捕获值,使其类似于其他编程语言中的闭包或lambda

总之:Block块是Objective-C的对象,块是一个独立的自治代码片段,总是存在于另一个编程结构的范围内。
参考Apple开发文档

一、iOS Block 概念

Apple文档介绍Block是Object-C的对象,Object-C的对象创建过程,确认对象的名字(变量名),创建对象(对象的堆栈区)。Block块其实和对象创建很类似,创建的规则不一样。下边介绍一下Block创建的规则和使用的方法。

Block定义分为两个模块。1.block变量(block:block代码块定义的声明的变量名) 2.表达式(block:独立自治的代码片)

1.Block 变量

Block块变量的定义和使用函数指针引用C函数的方式相同,您可以声明一个变量来跟踪块,如下所示:

void (^simpleBlock)(void);
返回值类型 (^变量名)(参数列表)

####2.Block 表达式
Block块 表达式和C匿名函数的方法表达式相同。

^ int (int count) {
return count + 1;
};
^ 返回值类型 (参数列表) {表达式}

3.Block块使用常见和各种情况
3.1Block 表达式

Block表达式语法:

^ 返回值类型 (参数列表) {表达式}

例如:

^ int (int count) {    //返回值, 参数列表
       return count + 1;
};

其中,可省略部分有:

  • 返回类型,例:
 ^ (int count) {
        return count + 1;
 };
  • 参数列表为空,则可省略,例:
^ {
       NSLog(@"No Parameter");
};
3.2Block 变量

声明Block类型变量语法:

返回值类型 (^变量名)(参数列表) = Block表达式

例如,如下声明了一个变量名为blk的Block:

int (^blk)(int) = ^(int count) {
        return count + 1;
    };

当Block类型变量作为属性时,写作:

typedef int (^blk_k)(int);
@property(copy) blk_k blk;

-(void)initBlockProperty{
      _blk = ^(int count) {
        return count + 1;
    };
}
-(void)test{
    _blk();
}

当Block类型变量作为函数的参数时,写作:

- (void)func:(int (^)(int))blk {
    NSLog(@"Param:%@", blk);
}

借助typedef可简写:

typedef int (^blk_k)(int);

- (void)func:(blk_k)blk {
    NSLog(@"Param:%@", blk);
}

Block类型变量作返回值时,写作:

- (int (^)(int))funcR {
    return ^(int count) {
        return count ++;
    };
}

借助typedef简写:

typedef int (^blk_k)(int);

- (blk_k)funcR {
    return ^(int count) {
        return count ++;
    };
}

二、Block底层原理

对Block进行行深入的分析,把block编译解析,查看底层Block是如何实现的,通过使用Clang把Block解析成C++源码
Block结构

int main() {
    int count = 100;
    void (^ blk)() = ^(){
        NSLog(@"In Block:%d", count);
    };
    blk();
}

clang -rewrite-objc 源码文件名

解析之main方法内的源码:

int main() {
    int count = 100;
    void (* blk)(void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, count));
    ((void (*)(__block_impl *))((__block_impl *)blk)->FuncPtr)((__block_impl *)blk);
}

从解析出来的源代码看,main内包含一个__main_block_impl_0的Block块,而定义的Block块被解析成__block_impl,接下来看一下这些内容Block块的具体内容。

// main_block 块
struct __main_block_impl_0 {
  struct __block_impl impl;   //定义的那个block块
  struct __main_block_desc_0* Desc;   // main Block的描述
  int count;                          //定义的那个count

//  block 实现内部实现细节赋值等内容
  __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _count, int flags=0) : count(_count) {
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};


// 主要是block块对count进行复制出来
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
  int count = __cself->count; // bound by copy
                                             // __cself相当于Objective-C中的self
        NSLog((NSString *)&__NSConstantStringImpl__var_folders_d0_ts4pl5295tnfzz5ls4lj_z8w0000gp_T_main2_e76fdd_mi_0, count);
}

// block块的描述 
static struct __main_block_desc_0 {
  size_t reserved;   // block块预留的内存
  size_t Block_size;   // block块的内存
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)};

// Block块的结构体
struct __block_impl {   
  void *isa;
  int Flags;
  int Reserved;
  void *FuncPtr;
};

在Objective-C中,任何类的定义都是对象。类和类的实例(对象)没有任何本质上的区别。任何对象都有isa指针。block块中包含isa,验证苹果文档说Block是Object-C的对象。

  • 注意事项:block容易造成循环引用,在block里面如果使用了self,然后形成强引用时,需要打断循环引用;在MRC下用_block,在ARC下使用__weak;

三、关于block在内存中的位置

对于block块的存储位置(block入口的地址)可能存放在3个地方:代码区(全局区)、堆区、栈区(ARC情况下回自动拷贝到堆区、因此ARC下只有两个地方:代码区和堆区)。
11111.png

Block有三种类,根据Block对象创建时所处数据区不同而进行区别:

  • **_NSConcreteStackBlock:**在栈上创建的Block对象

  • **_NSConcreteMallocBlock:**在堆上创建的Block对象

  • **_NSConcreteGlobalBlock:**全局数据区的Block对象
    222.png

  • 代码区:不访问栈区的变量(如局部变量),且不访问堆区的变量(如用alloc创建的对象)时,此时block存放在代码区;

  • 栈区:把栈区的代码复制到堆区,延长使用Block块的使用时间(Block传值)copy

  • 堆区:如果访问了堆区的变量(如局部变量),或堆区的变量(如用alloc创建的对象),此时block存方在堆区

实际是放在栈区,在ARC情况下自动拷贝到堆区,如果不是ARC则存放在栈区,所在函数执行完毕就回释放,想再外面调用需要用copy指向它,这样就拷贝到了堆区,strong属性不会拷贝、会造成野指针错区。(需要理解ARC是一种编译器特性,即编译器在编译时在核实的地方插入retain、release、autorelease,而不是iOS的运行时特性)。
此外代码存在堆区时,需要注意,因为堆区不像代码区不变化,堆区是动态的(不断的创建销毁),当没有强指针指向的时候就会被销毁,如果再去访问这段代码时,程序就会崩溃!所以此种情况在定义block属性时需要指定为strong or copy。block是一段代码,即不可变,所以使用copy也不会深拷贝。

总结

在使用Block过程中,常用的几种修饰词
1.避免在对象循环引用__weak、__strong
2.在block内使用变量使用__block
3.延长block的使用时间使用copy修饰

Oracle PLM Agile936 单点登录配置方式 阅读详情

相关推荐

Astah 9.0升级步骤(Widnows/Mac OS)

Astah Professional是一款全新的轻量级UML建模工具。软件集思维导图和UML建模于一体,采用100%纯JAVA构建, 兼容性强,不仅能够实现分布式建模、项目合并,还能够实现和其它建模工具的交互。

tequiero777的博客 2825

如何利用 CompletableFuture 实现“旅游平台”问题?

旅游平台问题 如果想要搭建一个旅游平台,经常会有这样的需求,那就是用户想同时获取多家航空公司的航班信息。比如,从北京到上海的机票钱是多少?有很多家航空公司都有这样的航班信息,所以应该把所有航空公司的航班、票价等信息都获取到,然后再聚合。由于每个航空公司都有自己的服务器,所以分别去请求它们的服务器就可以了,比如请求国航、海航、东航等,如下图所示 串行 一种比较原始的方式是用串行的方式来解决这个问题 比如我们想获取价格,要先去访问国航,在这里叫作 website 1,然后再去访问海航 websi

vincent_wen0766的博客 331

智能车竞赛卡丁快跑组:自动驾驶与人车交互技术实战解析

本文深入解析了智能车竞赛卡丁快跑组的技术核心,重点探讨了自动驾驶与人车交互两大模块的实战方案。文章详细拆解了从环境感知、路径规划到语音识别、命令执行的完整流程,并分享了基于单片机平台的调试心法与赛场经验,为参赛者提供了一套从零开始、分步攻坚的系统性备赛指南。

f0g1h2的博客 1177

浅谈iOS-Block

浅谈iOS-Block 对于 block 的语法,只放一张图即可。 Xcode 的默认编译器 clang ,在学习 Objective-C 中的 block ,会经常使用的 clang 的 -rewrite-objc 命令来将 block 的语法转换成C语言的 struct 结构,从而供我们学习参考。 1:Block本质 block本质上也是一个OC对象,它内部也有个isa指针 block封装了函数调用以及函数调用环境 block封装函数及其上下文 block底层结构图 struct __block_im

china_2014的博客 367

用Python玩转Iris数据集:从数据加载到可视化分析的完整指南

本文提供了使用Python处理Iris数据集的完整指南,涵盖数据加载、探索性分析、特征工程和可视化呈现等关键步骤。通过Pandas、NumPy、Matplotlib和Seaborn等工具,读者将学习如何从零开始完成一个机器学习项目的数据分析流程,掌握数据科学的核心技能。

j2k3l4的博客 850

ESP32锂电池电量检测实战:从引脚选择到低功耗优化(附完整电路图)

本文详细介绍了ESP32锂电池电量检测的实战方案,从ADC引脚选择到低功耗优化,提供完整的电路图和代码实现。通过MOS管智能开关和深度睡眠技术,显著降低静态功耗至0.5μA,提升设备续航能力。适合物联网开发者解决电量检测中的常见问题。

weixin_28731223的博客 462

iOS中block浅谈

iOS中为了方便两个类之间传值,推出了类似C语言函数的Block。 block的使用和函数类似,主要分三步: 1.block的定义:  void (^block)();

yrx1004的专栏 430

Flotherm XT学习历程

大家好,通过半年的热仿真软件学习使用,最终发现最好用,最好上手的软件就是Flotherm XT,对新手非常友好,但由于软件近几年才发布,网上教程非常少,后面我将在这里持续分析软件使用心得,和大家一起学习。

xiaoredred的博客 6264

iOS之block浅谈

前言 ios4.0系统已开始支持block,在编程过程中,block被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是inline的,并且它对局部变量是只读的。 block和函数的相似性:(1)可以保存代码(2)有返回值(3)有形参(4)调用方

czkyes的博客 4102

手把手教你学Simulink--基于多能源系统协同控制的复杂场景实例:氢燃料电池+锂电池混合动力电动汽车能量管理仿真

本文介绍了基于Simulink的氢燃料电池与锂电池混合动力电动汽车能量管理系统的建模与仿真方法。系统包含驾驶循环输入、燃料电池子系统、锂电池子系统、能量管理、电机驱动等模块,通过协同控制优化能源分配。详细说明了从模型创建到各子系统设置的7个步骤,并提供了MATLAB代码示例。该仿真可评估不同工况下的系统响应速度、能量利用效率和电池寿命等性能指标,为混合动力汽车的能量管理策略设计和优化提供参考。

MHD0815的博客 239

【AI编程】Trae 环境搭建与配置从使用到项目实战详解

Trae 环境搭建与配置从使用到项目实战详解

congge 5652

iOS浅谈Block

一、什么是Block Block是将函数及其执行上下文封装的对象。 __block_impl结构体内部中有isa,说明Block本质是OC对象。 二、Block变量截获 局部变量(对象)截获是值截获。比如: NSInteger num = 1; NSInteger(^block)(NSInteger) = ^NSInteger(NSInteger n) { return n * num; }; num = 2; NSLog(@"%zd",b

石头哥的博客 242

使用ArcGIS Pro进行土地利用分类的机器学习与深度学习

传统的土地利用分类方法通常依赖于手动解译和规则定义,但随着机器学习和深度学习的发展,我们现在可以利用这些技术来自动化和提高分类的精度。ArcGIS Pro是一种功能强大的GIS软件,它提供了丰富的工具和功能,可以支持土地利用分类的机器学习和深度学习。我们将首先讨论数据准备和预处理的步骤,然后介绍常用的机器学习和深度学习方法,并提供相应的源代码示例。这可以通过人工标注或半自动的方式完成。数据裁剪:根据研究区域的范围,裁剪遥感影像数据,以减少计算和存储的负担,并确保只包含感兴趣的土地利用区域。

code_program481的博客 2039

ios 添加block 类别_浅谈iOS之Block

前言iOS 4.0版本中,块不包含Objective-C中的新编程发现。 它们也存在于其他编程语言中(例如Javascript)和其他名称,例如Closures。 在iOS中,它们首次出现在4.0版本中,从那时起它们就已经被广泛接受和使用。 在随后的iOS版本中,Apple重新编写或更新了许多框架方法,因此它们采用了块,而且块似乎部分是代码编写方式的未来。 但他们到底有什么关系呢?块是添加到C,O...

weixin_34140828的博客 474

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ios 添加block 类别_iOS-Block 浅谈

前言:Block 是开发过程中常用便捷的回调方式,本文简单介绍 Block一、Block 简介Block 对象是 C 级别的语法和运行时特性,和标准的 C 函数类似,除了可执行代码外,还可能包含变量自动绑定(栈)和内存托管(堆)。一个 Block 维护一个状态集。闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」;Block 是 Objective-C 对于闭...

weixin_33955394的博客 429

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

block的理解 ios_浅谈iOS 对于block的一点理解

block是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是inline的,并且它对局部变量是只读的。Block的定义:int (^myBlock) (int a,int b) = ^(int a,int b){return a+b;};定义了一个名为myBlock的...

weixin_42561623的博客 217

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

浅谈iOS---block

blocks是C语言的扩充功能。用一句话来表示Blocks的扩充功能:带有自动变量(局部变量)的匿名函数。

weixin_61558111的博客 693

iOS-浅谈block

*block 跟 swift 中的闭包(closure)基本一样,都常用于值的回调,使用起来极为方便. *block 格式: 1)block 开头 是”^”,接着是由小括号包起来的参数列表,行为主体由大括号包起来. 2)block 有四种类型,分别是无参无返回值 无参有返回值 有参无返回值 有参有返回值,一般使用的block 一般都是有参block(使用block 主要目的就是参数的传递)

Setoge的博客 650

ios 添加block 类别_ios 浅谈block的基本使用[原创]

block:我们称代码块,他类似一个方法。其实block也是一个数据类型,只是这个数据类型比较的特殊,是用来保存代码块的数据类型。快捷键:输入inlineBlock}基本结构:返回值类型(^block名字)(参数类型) = ^返回值(参数类型 参数名 ){如果block有返回值,一定要记得在block代码中返回值但是申明中的返回值可以不写} ;//1.Block的参数是给Block代码块用的/...

weixin_39535349的博客 176

iOS 浅谈Block外部的变量传递

背景介绍在iOS开发过程中,我们经常会用到block这个对象,它可以作为函数的回调、类的属性等出现在我们的项目中,作为回调,block相对于代理方法,代码量更少,使用起来更方便,还可以使用与block定义同一作用范围的变量。当然,block的使用会让代码的逻辑不如使用代理清晰,萝卜青菜,各有所爱。下面我就对于block可以使用与它在同一作用范围的变量这一特性展开说一下自己的理解。 正文先看这样一段代

夏日的博客 2399

IOS 浅谈Block用法

1.block使用符号“^”表示,例如:  int (^myBlock)(int  a){        //块的实现代码     }; 此block块名称为myBlock,参数是int型的a,并返回int变量。 2.可以为常用的块创建typedef 如果定义一个块 typedefint (^myBlock)(int a) ;则系统多了一个myBlock类型.

s202090618的专栏 597

IOS 浅谈闭包block的使用

前言:对于ios初学者,block通常用于逆向传值,遍历等,会使用,但是可能心虚,会感觉block很神秘,那么下面就一起来揭开它的面纱吧。 ps: 下面重点讲叙了闭包的概念,常用的语法,以及访问变量,循环引用问题,至于底层的运行,堆栈block的区别,还有其他用法这里就不介绍了,目前也处于迷糊中,等到真正理解了再来补充 - -。 一. 概念 1. 什么是闭包? 闭包就是能够读取其他函数内...

weixin_30608131的博客 238

浅谈ios block(1)

block,顾名思义,就是一个代码块,它封装了一段代码,且这段代码可以再任何时候执行。它的行为和形式都和C语言中的函数很像(block本身就是C语言中的语法)。但是它具有很多函数所没有的优异的特性,这也奠定了它在OC中的地位。Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:blocks是inline的,并且它对局部变量是只读的。

wzhios的博客 402

浅谈iOS中Block的内存管理

一、前言:  Block是Objective-C中的一项强大的特性,Block可以看作是OC中对于闭包函数的实现,实质上Block也是一个对象~   二、内存分配区域: OC中的各个主要的内存分配区域:包括有--栈区、堆区、常量区、全局静态区、文本区(代码区)   内存分配区域 栈区:存放函数参数值、局部变量、函数返回地址等,我们每次调用函数,都会执行压栈操作(在XCode的左侧...

wqt925497045的博客 437

iOS探索:Block解析浅谈

什么是Block Block是将函数及其执行上下文封装起来的对象 接下来让我们通过源码来看一看Block的本质 我们在一个方法中写了三行代码,第一行是定义了一个局部变量,第二行是一个Block,第三行是这个Block的调用 这里我们通过一个clang的编译命令clang -rewrite-objc xxx.m来看一下源码的实现 我们的那段代码通过编译器编写后,首先第一行I代表的是一...

weixin_33830216的博客 121

浅谈——适配所有IOS版本的反地理编码的代理转block封装

浅谈——适配大部分IOS版本的反地理编码的代理转block封装(包括ios8.0之前、ios8.0之后到ios9.0之前和ios9.0之后)。。。。。。

LSL_LSL1314的博客 760
上一篇: 浅谈iOS 之@autoreleasepool
下一篇: 浅谈iOS之weak底层实现原理
Flame_Dream
博客等级 码龄12年 35粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值