《Objective-C高级编程 iOS与OS X多线程和内存管理》学习笔记——第二章Blocks

本文深入讲解C语言的扩展特性——Blocks。从Blocks的基本概念出发,介绍了Blocks的语法特点及使用方式,并探讨了如何通过__block说明符处理自动变量。此外,还详细解释了Blocks的实现原理。

一、Blocks概要

1、什么是Blocks

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

顾名思义,所谓匿名函数就是不带有名称的函数

二、Blocks模式

1、block语法

^(int event){
printf("buttonid:%d evaent=%d\n", i, event);
}
//实际上,该block语法使用了省略方式,其完整形式如下:
^void (int event){
printf("buttonid:%d event=%d", i, event);
}

如上所示,完整形式的block语法与一般的C语言函数定义相比,仅有两点不同:

  • 没有函数名;
  • 带有“^”符号;

“返回值类型”同C语言函数的返回值类型一样,“参数列表”同C语言的参数列表一样,“表达式”同C语言函数中允许使用的表达式一样。当然与C语言函数一样,表达式中含有return语句时,其类型必须与返回值类型相同;

//完整的block语句
^int (int count){return count + 1;}

block语法可省略好几个项目,首先是返回值类型:


省略返回值类型时,如果表达式中有return语句就是用该返回值类型;如果没有return语句就是用void类型;表达式中含有多个return语句时,所有return语句的返回值类型必须相同;

如果不使用参数,参数列表也可省略。以下为不使用参数列表的block语法:

^void (void){printf("Blocks");}
//该源代码可省略为如下形式:
^{printf("Blocks");}


2、block类型变量

在定义C语言函数时,可以将所定义函数的地址赋值给函数指针类型变量中:

int function (int count){
return count + 1;
}
int (*funcptr)(int) = &function;//这样一来,函数function的地址就能赋值给函数指针类型变量funcptr中;

在block语法下,可将block语法赋值给声明为block类型的变量中,即源代码中一旦使用饿了block语法就相当于生成了可赋值给block类型变量的值;

在block语法中,block生成的值也被称为block;

声明block类型变量的示例如下:

int (^blk)(int);

block类型变量与一般的C语言变量完全相同,可做用途如下:

  • 自动变量(局部变量)
  • 函数参数
  • 静态变量
  • 静态全局变量
  • 全局变量

使用block语法将block赋值为block类型变量:

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

//在函数中,使用block类型变量作为函数的参数传递
void function(int (^blk)(int)){}

//在函数返回值中指定block类型,使用block作为函数返回值
int (^function() (int)){
return ^(int count){return count;};

使用typedef解决block类型命名问题:

//使用typedef解决block类型命名问题:
typedef int (^blk_t)(int);
//如上所示,通过使用typedef可声明"blk_t"类型;

//原来的记述方式
void function(int (^blk)(int)){}
//使用typedef类型
void function(blk_t blk){}

//原来的记述方式
int (^func()(int)){}
//使用typedef类型
blk_t func(){}

//变量blk为block类型的情况下,这样调用block类型变量:
int result = blk(10);

//在函数参数中使用block类型变量并在函数中执行block的例子:
int function(blk_t blk, int rate){
return bulk(rate);
}
//block类型变量和完全像C语言变量一样使用,因此也可以使用指向block类型变量的指针,即block的指针类型变量:
typedef int(^blk_t)(int);
blk_t blk = ^(int count){return count+1;};
blk_t *blkptr = &blk;
(*blkptr)(10);

定义和使用block:

//第一种,无参数无返回值的block
void (^myBlock)() = ^(){};

//第二种,有参数无返回值的block
void (^myBlock)(int) = ^(int count){};

//第三种,有参数有返回值的block
int (^myBlock)(float) = ^int(float number){};

block语法总结:

  • 在类中定义一个block变量,就像定义一个C语言函数;
  • block变量可以定义在viewDidLoad函数外部,也可以定义在内部;
  • 只有调用block变量时,{}内部的代码才会执行;

3、截获自动变量值

4、__block说明符

int val = 0;
void (^blk)(void) = ^(){val = 1;};
blk();
printf("val = %d\n", val);
//以上为在block语法外声明的给自动变量赋值的源代码,该源代码会产生编译错误;

//如果想在block语法的表达式中将值赋给在block语法外声明的自动变量,需要在该自动变量上附加__block说明符;
__block int val = 0;
void (^blk)(void) = {val = 1;};
blk();
printf("val = %d\n", val);
//执行结果为:val = 1

5、截获的自动变量

虽然赋值给截获的自动变量array的操作会产生编译错误,但是使用截获自动变量的值却不会有任何问题;

三、blocks的实现

1、block的实质

2、截获自动变量值

3、__block说明符

4、block存储域

5、__block变量存储域

6、截获对象

7、__block变量和对象

8、block循环引用

9、copy/release


基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)内容概要:本文档围绕基于遗传算法的异构分布式系统任务调度算法展开研究,重点介绍了一种结合遗传算法的新颖优化方法,并通过Matlab代码实现验证其在复杂调度问题中的有效性。文中还涵盖了多种智能优化算法在生产调度、经济调度、车间调度、无人机路径规划、微电网优化等领域的应用案例,展示了从理论建模到仿真实现的完整流程。此外,文档系统梳理了智能优化、机器学习、路径规划、电力系统管理等多个科研方向的技术体系实际应用场景,强调“借力”工具创新思维在科研中的重要性。; 适合人群:具备一定Matlab编程基础,从事智能优化、自动化、电力系统、控制工程等相关领域研究的研究生及科研人员,尤其适合正在开展调度优化、路径规划或算法改进类课题的研究者; 使用场景及目标:①学习遗传算法及其他智能优化算法(如粒子群、蜣螂优化、NSGA等)在任务调度中的设计实现;②掌握Matlab/Simulink在科研仿真中的综合应用;③获取多领域(如微电网、无人机、车间调度)的算法复现创新思路; 阅读建议:建议按目录顺序系统浏览,重点关注算法原理代码实现的对应关系,结合提供的网盘资源下载完整代码进行调试复现,同时注重从已有案例中提炼可迁移的科研方法创新路径。
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)内容概要:本文提出了一种基于非支配排序的蜣螂优化算法(NSDBO),用于求解微电网多目标优化调度问题。该方法结合非支配排序机制,提升了传统蜣螂优化算法在处理多目标问题时的收敛性分布性,有效解决了微电网调度中经济成本、碳排放、能源利用率等多个相互冲突目标的优化难题。研究构建了包含风、光、储能等多种分布式能源的微电网模型,并通过Matlab代码实现算法仿真,验证了NSDBO在寻找帕累托最优解集方面的优越性能,相较于其他多目标优化算法表现出更强的搜索能力稳定性。; 适合人群:具备一定电力系统或优化算法基础,从事新能源、微电网、智能优化等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于微电网能量管理系统的多目标优化调度设计;②作为新型智能优化算法的研究改进基础,用于解决复杂的多目标工程优化问题;③帮助理解非支配排序机制在进化算法中的集成方法及其在实际系统中的仿真实现。; 阅读建议:建议读者结合Matlab代码深入理解算法实现细节,重点关注非支配排序、拥挤度计算蜣螂行为模拟的结合方式,并可通过替换目标函数或系统参数进行扩展实验,以掌握算法的适应性调参技巧。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值