Block全面分析

【教程】BM1684X-32边缘计算盒子 网络配置教程 BM1684X边缘计算盒子网络配置教程 阅读详情

1、第一部分

定义和使用Block,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- ( void )viewDidLoad
{
     [super viewDidLoad];
     //(1)定义无参无返回值的Block
     void  (^printBlock)() = ^(){
         printf ( "no number" );
     };
     printBlock();
     
 
     printBlock(9);
     
     int  mutiplier = 7;
     //(3)定义名为myBlock的代码块,返回值类型为int
     int  (^myBlock)( int ) = ^( int  num){
         return  num*mutiplier;
     }
     //使用定义的myBlock
     int  newMutiplier = myBlock(3);
     printf ( "newMutiplier is %d" ,myBlock(3));
}
//定义在-viewDidLoad方法外部
//(2)定义一个有参数,没有返回值的Block
void  (^printNumBlock)( int ) = ^( int  num){
     printf ( "int number is %d" ,num);
};

定义Block变量,就相当于定义了一个函数。但是区别也很明显,因为函数肯定是在-viewDidLoad方法外面定义,而Block变量定义在了viewDidLoad方法内部。当然,我们也可以把Block定义在-viewDidLoad方法外部,例如上面的代码块printNumBlock的定义,就在-viewDidLoad外面。

再来看看上面代码运行的顺序问题,以第(3)个myBlock距离来说,在定义的地方,并不会执行Block{}内部的代码,而在myBlock(3)调用之后才会执行其中的代码,这跟函数的理解其实差不多,就是只要在调用Block(函数)的时候才会执行Block体内(函数体内)的代码。所以上面的简单代码示例,我可以作出如下的结论,

(1)在类中,定义一个Block变量,就像定义一个函数;

(2)Block可以定义在方法内部,也可以定义在方法外部;

(3)只有调用Block时候,才会执行其{}体内的代码;

(PS:关于第(2)条,定义在方法外部的Block,其实就是文件级别的全局变量)

那么在类中定义一个Block,特别是在-viewDidLoad方法体内定义一个Block到底有什么意义呢?我表示这时候只把它当做私有函数就可以了。我之前说过,Block其实就相当于代理,那么这时候我该怎样将其与代理类比以了解呢。这时候我可以这样说:本类中的Block就相当于类自己服从某个协议,然后让自己代理自己去做某个事情。很拗口吧?看看下面的代码,

?
1
2
3
4
5
6
7
8
9
10
//定义一个协议
@protocol ViewControllerDelegate<NSObject>
- ( void )selfDelegateMethod;
@end
 
//本类实现这个协议ViewControllerDelegate
@interface ViewController ()<ViewControllerDelegate>
@property (nonatomic, assign) id<ViewControllerDelegate> delegate;
 
@end

接着在-viewDidLoad中的代码如下,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- ( void )viewDidLoad
{
     [super viewDidLoad];
     // Do any additional setup after loading the view from its nib.
     self.delegate = self;
     if  (self.delegate && [self.delegate respondsToSelector:@selector(selfDelegateMethod)]) {
         [self.delegate selfDelegateMethod];
     }
}
 
#pragma mark - ViewControllerDelegate method
//实现协议中的方法
- ( void )selfDelegateMethod
{
     NSLog(@ "自己委托自己实现的方法" );
}

看出这种写法的奇葩地方了吗?自己委托自己去实现某个方法,而不是委托别的类去实现某个方法。本类中定义的一个Block其实就是闲的蛋疼,委托自己去字做某件事情,实际的意义不大,所以你很少看见别人的代码直接在类中定义Block然后使用的,Block很多的用处是跨越两个类来使用的,比如作为property属性或者作为方法的参数,这样就能跨越两个类了。

2、第二部分

__block关键字的使用

在Block的{}体内,是不可以对外面的变量进行更改的,比如下面的语句,

?
1
2
3
4
5
6
7
8
9
10
- ( void )viewDidLoad
{
     //将Block定义在方法内部
     int  x = 100;
     void  (^sumXAndYBlock)( int ) = ^( int  y){
     x = x+y;
     printf ( "new x value is %d" ,x);
     };
     sumXAndYBlock(50);
}

这段代码有什么问题呢,Xcode会提示x变量错误信息:Variable is not assigning (missing __block type),这时候给int x = 100;语句前面加上__block关键字即可,如下,

?
1
__block  int  x = 100;

这样在Block的{}体内,就可以修改外部变量了。

3、第三部分:Block作为property属性实现页面之间传值

需求:在ViewController中,点击Button,push到下一个页面NextViewController,在NextViewController的输入框TextField中输入一串字符,返回的时候,在ViewController的Label上面显示文字内容,

(1)第一种方法:首先看看通过“协议/代理”是怎么实现两个页面之间传值的吧,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//NextViewController是push进入的第二个页面
//NextViewController.h 文件
//定义一个协议,前一个页面ViewController要服从该协议,并且实现协议中的方法
@protocol NextViewControllerDelegate <NSObject>
- ( void )passTextValue:(NSString *)tfText;
@end
 
@interface NextViewController : UIViewController
@property (nonatomic, assign) id<NextViewControllerDelegate> delegate;
 
@end
 
//NextViewController.m 文件
//点击Button返回前一个ViewController页面
- (IBAction)popBtnClicked:(id)sender {
     if  (self.delegate && [self.delegate respondsToSelector:@selector(passTextValue:)]) {
         //self.inputTF是该页面中的TextField输入框
         [self.delegate passTextValue:self.inputTF.text];
     }
     [self.navigationController popViewControllerAnimated:YES];
}

接下来我们在看看ViewController文件中的内容,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//ViewController.m 文件
@interface ViewController ()<NextViewControllerDelegate>
@property (strong, nonatomic) IBOutlet UILabel *nextVCInfoLabel;
 
@end
//点击Button进入下一个NextViewController页面
- (IBAction)btnClicked:(id)sender
{
     NextViewController *nextVC = [[NextViewController alloc] initWithNibName:@ "NextViewController"  bundle:nil];
     nextVC.delegate = self; //设置代理
     [self.navigationController pushViewController:nextVC animated:YES];
}
 
//实现协议NextViewControllerDelegate中的方法
#pragma mark - NextViewControllerDelegate method
- ( void )passTextValue:(NSString *)tfText
{
     //self.nextVCInfoLabel是显示NextViewController传递过来的字符串Label对象
     self.nextVCInfoLabel.text = tfText;
}

这是通过“协议/代理”来实现的两个页面之间传值的方式。

(2)第二种方法:使用Block作为property,实现两个页面之间传值,

先看看NextViewController文件中的内容,

?
1
2
3
4
5
6
7
8
9
10
11
12
//NextViewController.h 文件
@interface NextViewController : UIViewController
@property (nonatomic, copy)  void  (^NextViewControllerBlock)(NSString *tfText);
 
@end
//NextViewContorller.m 文件
- (IBAction)popBtnClicked:(id)sender {
     if  (self.NextViewControllerBlock) {
         self.NextViewControllerBlock(self.inputTF.text);
     }
     [self.navigationController popViewControllerAnimated:YES];
}

再来看看ViewController文件中的内容,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
- (IBAction)btnClicked:(id)sender
{
     NextViewController *nextVC = [[NextViewController alloc] initWithNibName:@ "NextViewController"  bundle:nil];
     nextVC.NextViewControllerBlock = ^(NSString *tfText){
         [self resetLabel:tfText];
     };
     [self.navigationController pushViewController:nextVC animated:YES];
}
#pragma mark - NextViewControllerBlock method
- ( void )resetLabel:(NSString *)textStr
{
     self.nextVCInfoLabel.text = textStr;
}

好了就这么多代码,可以使用Block来实现两个页面之间传值的目的,实际上就是取代了Delegate的功能。


转:http://my.oschina.net/leejan97/blog/268536

基于SpringBoot+SpringCloud+Vue前后端分离项目实战 --开篇 如何高效学习Java? 毕业设计项目应该怎么做?入门实战项目应该怎么做? 做Java开发都应该学习哪些框架技术? 我想来跟你聊聊为什么要学习此专栏?我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,当你迷茫想努力没有方向时,最事半功倍的方法是:找人带你! 因为过来人,更懂得如何学、如何做、如何少走弯路! 那今天就给大家带来一门专栏课程,由 天罡gg 和 经海路大白狗 两位实力大牛合力打造的一款专栏,可以让你从0到1快速拥有企业级规范的项目实战经验! 阅读详情

相关推荐

全网最详细Seurat v5 流程复现(拿来即用)

本文是基于seurat v5版本的教程复现,主要依据来源于官网seurat v5建议大家有时间的话可以去官网进行详细阅读学习!本节内容在之前seurat v4的教程都很多都有提到,文章所用到的数据及代码已经给各位放在这里了,有需要自取!请点击这里哦提取码:bui1。

ZxVSaccount的博客 1万+

iOS深入学习(Block全面分析)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33724659的博客 220

IGV新手必看:5分钟搞定ChIP-seq/DAP-seq/ATAC-seq数据可视化(附常见报错解决方案)

本文为IGV新手提供了一份快速上手的实战指南,详细讲解了如何高效完成ChIP-seq、DAP-seq、ATAC-seq等数据的可视化。内容涵盖软件安装、基因组导入、文件格式转换与优化,并重点剖析了“导入后一片空白”等常见报错的根本原因与解决方案,帮助用户在5分钟内避开雷区,生成可用于发表的IGV专业图谱。

weixin_29198045的博客 538

iOS之Block分类和使用注意事项

Block有三种类型:的三种类型.并都继承于NSBlock 我们在讲的三种类型之前,先了解一下程序的内存分配情况,因为不同类型的分配的内存也不同.。在iOS中内存主要分为五大区域:栈区、堆区、静态区、常量区、代码段不同block类型的内存分配 结论: 没有访问 auto变量 的block 就是 __NSGlobalBlock...

wywinstonwy的专栏 2939

nupkg 本地安装_使用Nuget安装离线包nupkg

一:Nuget简介:NuGet 是免费、开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库。当需要分享开发的工具或是库,需要建立一个Nuget package,然后把这个package放到Nuget的站点。如果想要使用别人已经开发好的工具或是库,只需要从站点获得这个package,并且安装到自己的Visual Studio项目或是解决方案里。NuGet能更方便地把一...

weixin_34460380的博客 1万+

告别纯文本RAG:用Dify 1.11.0多模态知识库,5步搭建一个能“读图”的智能客服助手

本文详细介绍了如何利用Dify 1.11.0多模态知识库构建智能视觉客服助手,通过5个步骤实现图片内容理解与专业回复。从准备多模态素材到配置知识库节点,再到设计工作流逻辑和性能优化,帮助开发者快速搭建高效客服系统,显著提升用户体验和问题解决效率。

weixin_30832143的博客 451

eigen 构造变换矩阵(Eigen::Isometry3d或者Eigen::Matrix4d)的几种方式

Eigen::Isometry3d的赋值有两种方式 1.对各个元素赋值 Eigen::Isometry3d T1=Eigen::Isometry3d::Identity(); T1(0,0) = 1.000000e+00, T1(0,1) = 1.197624e-11, T1(0,2) = 1.704639e-10, T1(0,3) = 3.214096e-14; T1(1,0) = 1.197625e-11, T1(1,1) = 1.197625e-11, T1(1,2) = 3.562503e-10,

HelloJinYe的博客 2万+

数据基础设施建设任务中的技术名词解析

近日,国家数据局确定了18个数据基础设施建设任务(先行先试)承担地区,建设任务内容为:数场、数据空间、数据原件、隐私计算、数联网、区块链。这些概念都有什么样的内涵,他们的相互关系是怎样的?

五角大寨 5305

Python 读取大文件(GB) & yield 的使用

原文地址 https://blog.youkuaiyun.com/shudaqi2010/article/details/54017766 https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/   最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large ...

u012733099的博客 5818

LabVIEW机器视觉通用软件

LabVIEW 通用视觉一款仿C模式的思想与方法 全网最精简零基础+通用视觉全套视频教程 只想把LabVIEW当作一种兴趣,结果却当成了职业 http://t.elecfans.com/c1181.html 本次(开源 )针对有一定视觉基础或项目开发经验的工程师量身打造视觉通用性系统(完全仿面向对象的原理),相对于一般的非标框架更具功能性,有效的解决复杂项目开发过程中的思路瓶颈。 LabVIEW通用视觉系统:通用软件可快速解决大部分简单的视觉开发项目,帮助众多软件工程师解决在非标视觉软件开发中的繁琐过程问

qq_21516871的博客 4609

5GCPE与4G物联网卡兼容实战:通过AT指令修改IMEI实现设备迁移

本文详细介绍了如何通过AT指令修改5GCPE设备的IMEI,实现4G物联网卡的设备迁移。从硬件准备、驱动安装到串口工具配置,再到具体的AT指令操作步骤,提供了全面的实战指南。文章还包含信号优化、APN设置等实用技巧,帮助用户顺利完成设备迁移并提升网络性能。

weixin_28684757的博客 626

block 语句

// // main.m // LessonBlock // block语句 // Created by lanouhn on 14-8-9. // Copyright (c) 2014年 vaercly@163.com 陈聪雷. All rights reserved. // //在其他.m文件中定义的全局变量要想在本.m文件中使用, 则需在本文件的.m中要用关键字extern修饰该变

vaercly的专栏 1838

ShengBTE热导计算:利用ShengBTE计算热导显示NAN的原因是什么?算出的热导不随平均声子自由程变化

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 963

iOS中Block实现原理的全面分析

本人简书地址iOS中Block实现原理的全面分析 Block的底层基本结构 void blockTest() { void (^block)(void) = ^{ NSLog(@"Hello World!"); }; block(); } int main(int argc, char * argv[]) { @autoreleasepool {...

weixin_34419321的博客 233

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

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

block全面分析

本文翻译自苹果的文档,有删减,也有添加自己的理解部分。 如果有Block语法不懂的,可以参考fuckingblocksyntax,里面对于Block 为了方便对比,下面的代码我假设是写在ViewController子类中的 1、第一部分 定义和使用Block, ? 1 2 3 4 5 6 7

揽月清风 291

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

iOS中Block全面分析

本文转载自:http://my.oschina.net/leejan97/blog/268536 本文翻译自苹果的文档,有删减,也有添加自己的理解部分。 如果有Block语法不懂的,可以参考fuckingblocksyntax。 为了方便对比,下面的代码我假设是写在ViewController子类中的。 1、定义和使用Block - (void)viewDidLo

Minecraft 1160

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

iOS中的block全面分析

代理设计模式对于iOS开发的人来说肯定很熟悉了,代理delegate就是委托另一个对象来帮忙完成一件事情,为什么要委托别人来做呢,这其实是MVC设计模式中的模块分工问题,例如View对象它只负责显示界面,而不需要进行数据的管理,数据的管理和逻辑是Controller的责任,所以此时View就应该将这个功能委托给Controller去实现,当然你作为码农强行让View处理数据逻辑的任务,也不是不行,

guanghuotainkong的博客 429

iOS Block全面分析

http://my.oschina.net/leejan97/blog/268536 http://blog.youkuaiyun.com/enuola/article/details/8674063 注意事项 1.内联的block中内部定义的变量 自己本身有读写权限 2.block内部要修改外部变量 需要将外部变量声明__block 3.Block retain...

weixin_30563319的博客 89

Block全面分析-Block和Delegate的对比

1、第一部分 定义和使用Block, ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - (void)viewDidLoad {     [super viewDidLoad];     //(1)定义无参无返回值的B

张少侠 653
上一篇: iOS中block实现的探究
下一篇: GCD 基础
直隶码农
博客等级 码龄19年 95粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值