OC对象 - Block内存管理

【OC】block的实现 Block语法实际上是作为极普通的C语言代码来处理的。通过支持Block的编译器,含有Block语法的源代码转换为一般C语言编译器能够处理的源代码,并作为极为普通的C语言源代码被编译。这只不过是概念的问题,在实际编译时无法转换成我们能够理解的源码,但clang具有转换成我们可读源代码的功能。通过“-rewrite-objc”选项就能将含有block语法的源代码转换为C++的源代码。说是C++,其实尽是使用了struct结构,其本质是C语言的源代码。clang -rewrite-objc 源代码文件名。 阅读详情

OC对象 - Block内存管理

1. block从栈拷贝到堆

  • 当block在栈上时,并不会对__block变量产生强引用
  • 当block被copy到堆时
    1. 会调用block内部的copy函数
    2. copy函数内部会调用_Block_object_assign函数
    3. _Block_object_assign函数会对__block变量形成强引用(retain)

1.1 分析

  • 假设有__block变量,Block0、Block1都使用__block变量
  • 此时__block变量,Block0、Block1都是在栈上,Block0、Block1并没有对__block变量产生强引用
  • 当Block0复制到堆上时,同时会把__block变量复制到堆上,并且强引用__block变量

  • 接着Block1也复制到堆上时,在此之前__block变量已经复制到堆上了,Block1此时也会强引用__block变量

2 block从堆中移除

  • 当block从堆中移除时
    1. 会调用block内部的dispose函数
    2. dispose函数内部会调用_Block_object_dispose函数
    3. _Block_object_dispose函数会自动释放引用的__block变量(release)

2.1 分析

2.1.1 单个block持有
  • Block从堆中移除时,会释放引用的__block变量
  • 此时__block变量没有其他持有者了,因此也销毁了

2.1.2 多个block持有
  • Block0、Block1都持有__block变量
  • Block0从堆中移除时,会释放对__block变量的引用
  • 此时__block变量还被Block1引用着
  • Block1也从堆中移除,也释放对__block变量的引用
  • 此时__block变量没有其他持有者了,因此也销毁了

3. block的__forwarding指针

使用__block修饰的变量,编译器会将__block变量包装成一个对象,对象对应的结构体如下

注意到里面的__forwarding,并且在修改值的时候,它也是通过访问包装对象的__forwarding,再访问将要操作的变量

3.1 原因

block使用过程中,是可能从栈上拷贝到堆上的,__forwarding是指向自己的指针,当block在栈上时,他指向的是栈上的自己


当block拷贝到堆上后,栈上的block的__forwarding指向复制到堆上的__block变量用结构体的指针,堆上的block的__forwarding指向的还是自己本身的指针

这就可以保证,block复制到堆上后,不管使用栈上的block,还是堆上的block,都能通过__forwarding访问堆上的block

4. 对象类型的auto变量 VS 添加__block修饰符的变量

__block int age = 10;
        
ZSXPerson *person = [[ZSXPerson alloc] init];
    
ZSXBlock block = ^ {
    age = 20;
    NSLog(@"age is %d", age);
    NSLog(@"person is %d", person);
};

4.1 当block在栈上时,对它们都不会产生强引用

4.2 当block拷贝到堆上时,都会通过copy函数来处理它们

  • __block变量(假设变量名叫做a)
    1. _Block_object_assign((void*)&dst->a, (void*)src->a, 8/BLOCK_FIELD_IS_BYREF/);
  • 对象类型的auto变量(假设变量名叫做p)
    1. _Block_object_assign((void*)&dst->p, (void*)src->p, 3/BLOCK_FIELD_IS_OBJECT/);

4.3 当block从堆上移除时,都会通过dispose函数来释放它们

  • __block变量(假设变量名叫做a)
    1. _Block_object_dispose((void*)src->a, 8/BLOCK_FIELD_IS_BYREF/);
  • 对象类型的auto变量(假设变量名叫做p)
    1. _Block_object_dispose((void*)src->p, 3/BLOCK_FIELD_IS_OBJECT/);

@oubijiexi

西门子交换机环网冗余设置(实战篇2.2) MRP的重组时间为 200ms 因此 PROFINET 通信必须选择大于 200ms 的看门狗时间,看门狗。ET200SP默认为 2ms*3=6ms) MRP 的重组时间为 200ms 故系统会报出看门狗超时。更新,默认是 3 个周期,超出设置的周期数就会报 IO 设备故障。时间不是直接配置的,而是作为没有 IO 数据可接受的更新周期,也就是允许几个周期没有数据。来达到大于 200ms 的看门狗时间的要求(看门狗时间 可接受更新周期数 更新时间)。是IO 控制器和 IO 设备) 阅读详情

相关推荐

TSC条码打印机C#例程(tsclib.dll调用) 【转】

//----program.cs using System;using System.Collections.Generic;using System.Windows.Forms; using System.Runtime.InteropServices;public class TSCLIB_DLL{[DllImport("TSCLIB.dll", EntryPoint = "abou...

weixin_33843947的博客 2440

OC底层探索(二十三)Block用法及原理

Block的使用 return_type表示返回的对象/关键字等(可以是void,并省略) blockName表示block的名称 var_type表示参数的类型(可以是void,并省略) varName表示参数名称 return_type表示返回的对象/关键字等(可以是void,并省略) blockName表示block的名称 var_type表示参数的类型(可以是void,并省略) Block声明及定义语法 varName表示参数名称 return_type (^blockNam

正在注销账号的博客 1107

LSS(Lift, Splat, Shoot)算法解析

**LSS(Lift, Splat, Shoot)** 是一个比较经典的自下而上的构建BEV特征的3D目标检测算法,通过将图像特征反投影到3D空间生成伪视锥点云,通过`Efficientnet`算法提取云点的深度特征和图像特征并对深度信息进行估计,最终将点云特征转换到BEV空间下进行特征融合和后续的语义分割任务。 本篇按照LSS代码的运行逻辑,结合论文对LSS算法进行解析。

超爱吃小蛋糕的66的博客 8680

OC基础 Block

什么是Blocks Blocks是C语言的扩充功能。可以概括为:带有自动变量(局部变量)的匿名函数。 所谓的匿名函数,就是没有名字的函数,在C语言中是不允许的。 在计算机科学中,这种概念也称为:“闭包Closure”、“lambda计算”等。 而且一般而言,函数或者方法里是不能又出现一个函数的,但是Blocks作为一种数据类型,是可以的。通常Blocks用于封装代码。因为即便是写在函数体内部,不去调用它,就不会执行。 Blocks的声明 //无参数 无返回值 void (^block1)(void)

乐事派的专栏 2071

LoRa无线通信技术介绍(六)SX127X芯片收发程序讲解

接收LORA芯片SX127X的收发程序。

DT程序员的博客 1751

拼多多Android面试题及参考答案

Android 系统采用分层架构设计,从底层到上层依次为Linux 内核层硬件抽象层(HAL)系统运行时库层应用框架层应用层,共五层。位置:Linux 内核层与系统运行时库层之间,是“硬件与系统的隔离层”。核心作用:屏蔽硬件差异,为上层提供统一的硬件访问接口,解决 Android 开源与硬件厂商闭源的矛盾,具体功能如下:硬件能力抽象:将硬件的具体实现(如不同厂商的摄像头芯片、音频芯片)封装为标准化接口(如Camera HALAudio HAL。

大模型大数据攻城狮的专栏 1280

OC - Block 详解

1.Block 的使用 Block 是什么? 块,封装了函数调用以及调用环境的 OC 对象, Block 的声明 // 1. @property (nonatomic, copy) void(^myBlock1)(void); // 2.BlockType:类型别名 typedef void(^BlockType)(void); @property (nonatomic, copy) BlockT...

weixin_42350379的博客 1472

【Windows Server 2019】组策略的配置与管理——理论基础

博文介绍了组策略的定义,作用和分类。组策略包括计算机配置和用户配置;组策略又分为为基于本地的组策略和基于AD(活动目录)的域组策略。并说明了不同组策略发生冲突时默认的规则。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 1万+

一顿饭的功夫带你了解block是如何内存管理的

2.1、不需要内存管理的情况: >1、**当block在栈上**:block内部不会对__block变量产生强引用,所以不需要内存管理 2、**基本数据类型,没有加 __block 修饰符的**:block内部是值存储,不涉及对象管理,所以不需要内存管理。 3、**static变量和全局变量**:内存放在数据段,由程序统一管理,可全局访问,长期持有而且不会销毁,所以不需要内存管理。 2.2、需要进行内存管理的情况:

chenzimin_blog 1526

面试问题总结——关于YOLO系列(三)

接着上篇的的YOLO系列面试问题总结,加油,冲! 三.YOLOv3 1.YOLOv3主干网络BackBone——Darknet-53网络结构(因为有53个卷积层) (原论文中Darknet53的尺寸是在图片分类训练集上训练的,所以输入的图像尺寸是256x256,而在YOLOv3中输入尺寸是416×416)   ①上图中,Top-1 Accuracy和Top-5 Accuracy是指什么呢?区别在哪呢?   我们知道ImageNet有大概1000个分类,而模型预测某张图片时,会给出1000个按概率从高.

boss-dog 1万+

【华为OD机试真题】29、组成最大数 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS)

题目描述 >小组中每位都有一张卡片,卡片上是6位内的正整数,将卡片连起来可以组成多种数字,计算组成的最大数字

KJ.JK 2418

Block 阅读笔记

https://www.jianshu.com/p/25a7ba546eac https://www.jianshu.com/p/4e79e9a0dd82 看了"小胖白兔"的两篇关于Block的文章,感觉获益良多。 再次总结一下阅读笔记,便于自己查看 1、Block是什么 Block本质上也是一个OC对象,是封装了函数调用以及函数调用上下文环境的OC对象 2、Block有哪几种 Block的类型...

阿飞小伙子_博客 312

⚡【C++要笑着学】(13) STL介绍:什么是STL标准模板库 | STL的版本 | 浅谈STL的缺陷

再讲解函数模板之前先对STL做一个小铺垫,本篇将对STL做一个简单的介绍。

有道无术, 术尚可求。有术无道, 止于术。 3034

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

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

iOS内存管理

iOS内存管理 iOS中存在两种类型的对象: 1)     OC中的对象,NSObject的子类; 2)     Core Foundation(C语言框架)对象; 对于不同类型的对象,其内存管理的方式也不同。在OC中,对象的内存管理分为手动管理(非ARC)和自动管理(ARC),也就是说ARC只能管理OC的对象,而不能管理Core Foundation对象。所以,在管理对象内存时,首先要做

sunshuolei的专栏 826

WINCC7.3破解文件

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

Block常见面试题精华版

Block 在定义时捕获变量的状态,而不是在执行时,所以 block 内部看到的外部变量是在 block 创建时的快照。:Block 只能捕获其作用域内的变量的值,如果需要在 block 内部修改外部变量,那么这个变量必须使用。这个模式是一种预防性的做法,用以确保在 block 执行的时候,即使是在异步操作中,对象(通常是。:如果 block 在多线程环境中执行,需要确保 block 内部访问的数据是线程安全的。并希望在 block 执行的过程中确保被捕获的对象不会被释放,你会将。

opentogether的博客 997

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Objective-C内存管理:Block

总述 以下环境都在ARC环境下,常规设置,使用XCode10测试。 这篇文章会解决以下几个问题: Block作为属性声明时为什么都声明为Copy? Block为什么能保存外部变量? Block中__block关键字为何能同步Block外部和内部的值? Block有几种类型? 什么时候栈上的Block会复制到堆? Block的循环引用应该如何处理? Block外部__we...

weixin_34218890的博客 441

OC基础知识点

OC基础知识点   补充: 1、所有可变的集合才能添加元素(不可变数组能添加元素) 2、id类型就是对象 3、方法需要传递多个参数时,参数以冒号分隔 4、        逗号运算符:优先级最低,低于赋值运算符,计算时,执行最后一个表达式的值

大牛的IT征程 1135

Block原理

通过这篇文章,可以让小伙伴能理解Block的使用及注意细节,也让Block代码块在开发中运用得更加恰到好处,本人通过自己的理解来讲解这篇文章,若有错误,欢迎指正! 一、原理 typedef void(^myBlock)(void); myBlock block = ^{ printf("helloWorld"); }; block(); 我们将代码转换为C++源码来进行详细地分析 ...

jbr5740的专栏 192

OC 语言

OC 语言 共94题   1、#import 跟#include、@class有什么区别?#import 1)#import和#include都能完整地包含某个文件的内容,#import能防止同一个文件被包含多次,防止交叉编译 2)@class仅仅是声明一个类名,并不会包含类的完整声明;@class还能解决循环依赖的问题 3)#import   2、属性readwrite,re

LG_CodeMachine的博客 1607

Objective-C Block Copy操作与内存管理详解

在Objective-C编程中,Block作为重要的闭包实现方式,其内存管理机制直接影响代码性能与安全性。Block的内存布局包含isa指针、标志位和捕获变量等关键部分,而Copy操作则根据Block类型(全局、堆、栈)采取不同策略。理解_Block_copy_internal函数的实现原理,特别是对捕获变量(基本类型、OC对象、__weak修饰对象等)的处理方式,是开发高性能应用的关键。在ARC环境下,编译器会自动处理多数情况,但手动管理Block内存仍是高级开发的必备技能。本文深入解析Block Cop

weixin_33883104的博客 278

IOS底层面试题 Objective-c(Runtime、Runloop、Block、内存管理、多线程、性能优化等)

1. 一个NSObject对象占用多少内存? 系统分配了16个字节给NSObject对象。 通过malloc_size函数获得,该函数返回的是系统给该对象分配的内存大小,在64bit环境下,所获得的数值是16个字节的倍数 但NSObject对象只使用了8个字节的空间。 64bit环境下,可以通过class_getInstanceSize函数获得 ...

weixin_45043820的博客 1799

iOS 之__block/__weak/__bridge的用法说明

在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics、Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环境下编译器不会自动管理CF对象的内存,所以当我们创建了一个CF对象以后就需要我们使用CFRelease将其手动释放,那么CF和OC相互转化的时候该如何管理内存呢?答案就是我们在需要时可以使用__bri...

代码解释生活 706

ios面试题收集 (不定期更新)

1. tableview的内存使用注意事项 2. 网络图片加载流程及注意事项 3. ffmpeg代码层面的问题 4. mrc和arc下block的内存分配差别 这个问题也可以描述为 block一般用那个关键字修饰,为什么?  block一般使用copy关键之进行修饰,block使用copy是从MRC遗留下来的“传统”,在MRC中,方法内容的block是

用心去记录 511

XB_block(1)

1.block的本质 block本质上是一个OC对象,内部封装了函数调用和函数调用环境,底层结构如下图,第一位是__block_impl,第二位是__main_block_desc_0,后边是捕获的变量。 其中__block_impl中存有一个FuncPtr的函数指针,block通过该指针调用了内部的函数。 注意:当调用函数的时候理论上应该是block-->impl.FuncPtr这样...

HuberCui的博客 387

Block

1:block 本质上是一个 OC 对象,它内部也有一个 isa指针 2: block是封装了函数调用以及函数调用环境的 OC对象 3: 4:auto(默认)修饰的局部变量是值传递,static修饰的局部变量是指针传递,全局变量无需捕获,直接访问 5:oc方法默认会传参 方法调用者self和方法名_cmd 6:block有3中类型,可以通过 class 方法或者isa指针查看具体类型,最终都是...

weixin_34310127的博客 82
上一篇: OC对象 - Block修改变量
下一篇: OC对象 - Block解决循环引用
aiousee
博客等级 码龄14年 540粉丝 45原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值