__block的本质是变量的二次封装与引用----__forwarding

__block变量的操作:

1、型变操作:在编译时型变为结构体;

2、在复制时,引发本体转移和分身问题。

3、__forwarding的类型为型变类型;指向型变本体。

4、在形式上与变量的深浅拷贝有一定相似之处。

__block的本质是变量的二次封装与引用

在编译时编译成封装的结构体。

__block结构体变量的本体与分身。

本体转移。

struct __Block_byref_val_0 {

void *__isa;

__Block_byref_val_0 *__forwarding;

int __flags;

int __size;

int val;}

当把 __block 变量生成的结构体实例从栈复制到堆上时,会将成员变量 __forwarding 的值替换为复制目标堆上的 __block 变量(生成的结构体实例),如下图所示;

复制 __block 变量

作者:Tpphha
链接:https://www.jianshu.com/p/41dd3b8eb822
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/feng9exe/p/12262773.html

时间: 2024-10-18 01:16:29

__block的本质是变量的二次封装与引用----__forwarding的相关文章

《javascript设计模式》读书笔记二(封装和隐藏信息)

1.为什么要封装和信息隐藏 做过编程的朋友们知道"耦合"这个词,其实封装的效果就是为了解耦,让类和类之间没有太多的联系,防止某一天修改某一类的时候,产生"多米骨诺牌效应". 我们可以把信息隐藏看成目的,把封装看成达到信息隐藏的技术.通过封装就可以把对象的内部数据表现形式和实现细节进行隐藏.就好比你会看电视,但是你不知道电视的内部结构一样.但是在javascript中没有任何内置的机制,所以我们还需做些处理,同样来模仿封装. 2.创建对象的方法 1)最简单的一种方法就

Android-Volley网络通信框架(二次封装数据请求和图片请求(包含处理请求队列和图片缓存))

1.回想 上篇 使用 Volley 的 JsonObjectRequest 和 ImageLoader 写了 电影列表的样例 2.重点 (1)封装Volley 内部 请求 类(请求队列,数据请求,图片请求,图片缓存) (2)封装 Response.Listener 和 Response.ErrorListener 回调函数 (3)用法 3.文件夹介绍 3.1 GsonRequset.java 自己定义Gson请求,直接将 Json字符串  实例化为 对象 3.2 VolleyApplicatio

FMDB 二次封装工具类,让你快速学会封装,集成数据库

来源:StrivEver 链接:http://www.jianshu.com/p/4c77aee0b41c 上个版本为了增加用户体验,部分页面集成了离线缓存数据功能,于是就在项目里使用了数据库管理离线数据.下面交大家一步步学会使用FMDB,以及FMDB的二次封装,同事把我二次封装的数据库放出来,希望能够帮助大家快速学习,集成数据库功能吧. 一.首先看一下STDB文件结构   STDB文件结构 Table.h主要放一些Table的创建语句, 方便管理我的数据库各张表创建 DBDefine.h主要放

Xcode学习C++(二、指针和引用)

一:指针部分 指针是一种变量类型,声明指针变量需要分配独立的存储空间,指针可以为空『void』表示不指向任何对象. 指针里存储的值是一个地址,可以通过这个地址获取和改变所存储变量的值. 指针的类型必须与其所指向变量的类型一致,可以在任何时候改变指向的变量…… ————————————————————这些是简单理论的啰嗦,下面说些代码相关的———————————————————————————— 定义方式:int *p = &a;  *是指针的标识符,表示p是一个指针类型的变量,这里的变量a,必须

iOS_21团购_通过block对请求工具类的代理方法进行二次封装

最终效果图: [点评]提供的工具类DPAPI 在请求完毕后,使用的是代理机制,当一次请求成功或者失败时,会调用代理的相应方法 为了将点评提供的工具类DPAPI进行二次封装, 再次定义了一个block: typedef  void(^RequestDoneCallBackBlock)(id deals,NSError *err); 该block有两个参数, 分别是成功时,服务器返回的deals字典数组 另一个参数是:请求失败时,服务器返回的失败信息 两个参数分别对应代理的两个方法(即成功.失败时分

drf中 连表深度查询和ListSerializer类包括drf中Response二次封装

drf中Response二次封装: from rest_framework.response import Response ''' return MyResponse(status=1,msg='error',results=[],token='a.b.c',http_status=400,exception=True) Response模块的响应数据 data,最终数据results,Response模块需要向前台展示的一般有响应数据data(包括data里面的results),网络状态码s

iOS项目相关@AFN&SDWeb的二次封装

一,AFNetworking跟SDWebImge是功能强大且常用的第三方,然而在实际应用中需要封装用来复用今天就跟大家分享一下AFN&SDWeb的二次封装 1. HttpClient.h及.m .h定义了HTTP常用的四种GET POST PUT DELETE 请求 一般分别用做增删减查 定义前预处理,请求成功处理,请求失败处理的block 及带多参数w的方法声明 .m设置请求类型跟响应类型,监听网络是否有网络,如果没有,弹出网络异常的警示框 2. UIImageView+WebCache.h及

HtmlTestRunner二次封装(TestRunner.py)

将HtmlTestRunner进行二次封装,是报告生成的更方便 import HTMLTestRunner import unittest import time, os class TestRunner(object): def __init__(self, cases="./"): self.case = cases def get_all_cases(self, class_name): return unittest.defaultTestLoader.loadTestsFro

pywinauto二次封装(pywinnat.py)

将pywinauto常用方法进行封装,使得pywinauto用起来更简单 #头文件的引入 from pywinauto import application from pywinauto import clipboard import SendKeys import win32api import win32con import os, sys, time #二次封装的类 class Pywin(object): #======================= # pywin framwork