ios block是什么数据类型
2016-04-10 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
关注
展开全部
block定义
struct Block_descriptor {
unsigned long int reserved;
unsigned long int size;
void (*copy)(void *dst, void *src);
void (*dispose)(void *);
};
struct Block_layout {
void *isa;
int flags;
int reserved;
void (*invoke)(void *, ...);
struct Block_descriptor *descriptor;
/* Imported variables. */
};
实际上block就是这俩玩意了
我们来举个栗子看看
<img src="https://pic3.zhimg.com/a08d583dabdfc6cd0972587c61573c16_b.jpg" data-rawwidth="425" data-rawheight="136" class="origin_image zh-lightbox-thumb" width="425" data-original="https://pic3.zhimg.com/a08d583dabdfc6cd0972587c61573c16_r.jpg">
定义一个最简单block 打印hello world
使用clang指令
clang -rewrite-objc main.m
得到一个cpp文件
打开之,你就会看到什么是block了
<img src="https://pic1.zhimg.com/bf088ff76458124049c4de470dbcdd54_b.jpg" data-rawwidth="942" data-rawheight="462" class="origin_image zh-lightbox-thumb" width="942" data-original="https://pic1.zhimg.com/bf088ff76458124049c4de470dbcdd54_r.jpg">
你定义完block之后,其实是创建了一个函数,在创建结构体的时候把函数的指针一起传给了block,所以之后可以拿出来调用。
再看看值捕获的问题
<img src="https://pic3.zhimg.com/1e55d42a15b7ebe43a9a9599a6a55ad2_b.jpg" data-rawwidth="418" data-rawheight="170" class="content_image" width="418">
<img src="https://pic4.zhimg.com/65e8330e09658423ccb1c3b89a6c8023_b.jpg" data-rawwidth="964" data-rawheight="538" class="origin_image zh-lightbox-thumb" width="964" data-original="https://pic4.zhimg.com/65e8330e09658423ccb1c3b89a6c8023_r.jpg">定义block的时候,变量a的值就传递到了block结构体中,仅仅是值传递,所以在block中修改a是不会影响到外面的a变量的。定义block的时候,变量a的值就传递到了block结构体中,仅仅是值传递,所以在block中修改a是不会影响到外面的a变量的。
而加了__block前缀
<img src="https://pic3.zhimg.com/90a202eb15cfcd618bcb651a069b3a56_b.jpg" data-rawwidth="416" data-rawheight="175" class="content_image" width="416">
<img src="https://pic3.zhimg.com/64cc2bc2a19782e1eb5ff5c11fa2d126_b.jpg" data-rawwidth="1166" data-rawheight="635" class="origin_image zh-lightbox-thumb" width="1166" data-original="https://pic3.zhimg.com/64cc2bc2a19782e1eb5ff5c11fa2d126_r.jpg">并不是直接传递a的值了,而是把a的地址传过去了,所以在block内部便可以修改到外面的变量了。并不是直接传递a的值了,而是把a的地址传过去了,所以在block内部便可以修改到外面的变量了。
根据isa指针,block一共有3种类型的block
_NSConcreteGlobalBlock 全局静态
_NSConcreteStackBlock 保存在栈中,出函数作用域就销毁
_NSConcreteMallocBlock 保存在堆中,retainCount == 0销毁
而ARC和MRC中,还略有不同
struct Block_descriptor {
unsigned long int reserved;
unsigned long int size;
void (*copy)(void *dst, void *src);
void (*dispose)(void *);
};
struct Block_layout {
void *isa;
int flags;
int reserved;
void (*invoke)(void *, ...);
struct Block_descriptor *descriptor;
/* Imported variables. */
};
实际上block就是这俩玩意了
我们来举个栗子看看
<img src="https://pic3.zhimg.com/a08d583dabdfc6cd0972587c61573c16_b.jpg" data-rawwidth="425" data-rawheight="136" class="origin_image zh-lightbox-thumb" width="425" data-original="https://pic3.zhimg.com/a08d583dabdfc6cd0972587c61573c16_r.jpg">
定义一个最简单block 打印hello world
使用clang指令
clang -rewrite-objc main.m
得到一个cpp文件
打开之,你就会看到什么是block了
<img src="https://pic1.zhimg.com/bf088ff76458124049c4de470dbcdd54_b.jpg" data-rawwidth="942" data-rawheight="462" class="origin_image zh-lightbox-thumb" width="942" data-original="https://pic1.zhimg.com/bf088ff76458124049c4de470dbcdd54_r.jpg">
你定义完block之后,其实是创建了一个函数,在创建结构体的时候把函数的指针一起传给了block,所以之后可以拿出来调用。
再看看值捕获的问题
<img src="https://pic3.zhimg.com/1e55d42a15b7ebe43a9a9599a6a55ad2_b.jpg" data-rawwidth="418" data-rawheight="170" class="content_image" width="418">
<img src="https://pic4.zhimg.com/65e8330e09658423ccb1c3b89a6c8023_b.jpg" data-rawwidth="964" data-rawheight="538" class="origin_image zh-lightbox-thumb" width="964" data-original="https://pic4.zhimg.com/65e8330e09658423ccb1c3b89a6c8023_r.jpg">定义block的时候,变量a的值就传递到了block结构体中,仅仅是值传递,所以在block中修改a是不会影响到外面的a变量的。定义block的时候,变量a的值就传递到了block结构体中,仅仅是值传递,所以在block中修改a是不会影响到外面的a变量的。
而加了__block前缀
<img src="https://pic3.zhimg.com/90a202eb15cfcd618bcb651a069b3a56_b.jpg" data-rawwidth="416" data-rawheight="175" class="content_image" width="416">
<img src="https://pic3.zhimg.com/64cc2bc2a19782e1eb5ff5c11fa2d126_b.jpg" data-rawwidth="1166" data-rawheight="635" class="origin_image zh-lightbox-thumb" width="1166" data-original="https://pic3.zhimg.com/64cc2bc2a19782e1eb5ff5c11fa2d126_r.jpg">并不是直接传递a的值了,而是把a的地址传过去了,所以在block内部便可以修改到外面的变量了。并不是直接传递a的值了,而是把a的地址传过去了,所以在block内部便可以修改到外面的变量了。
根据isa指针,block一共有3种类型的block
_NSConcreteGlobalBlock 全局静态
_NSConcreteStackBlock 保存在栈中,出函数作用域就销毁
_NSConcreteMallocBlock 保存在堆中,retainCount == 0销毁
而ARC和MRC中,还略有不同
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家可靠的代理服务提供商,提供原生IP(住宅原生IP)和高匿名代理服务。以下是关于StormProxies的原生IP服务的一些信息:1. 住宅原生IP:StormProxies提供的住宅原生IP是指从真实的家庭或企...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询