ios学习之block初探
2023-09-11 14:20:45 时间
1. block概念
block是ios4.0+和Mac osX 10.6以后引进的对C语言的拓展,用来实现匿名函数的特性。所谓匿名函数,也称闭包函数。即同意创建一个暂时的没有指定名称的函数。
最经经常使用作回调函数(callback)參数的值,当然也有其它使用方法。
比方说作为一个变量值来使用,详细使用方法将在后面介绍。
2. block定义:
在iOS中,使用脱字符“^”来声明一个block变量,block的内容包括在“{}”中的。而且和C语言一样用“。”来表示语句的结束。
详细定义例如以下图所看到的:
1⃣️ 我们先来定义一个简单的。无返回值,无參数的block:
-(void)blockTestOne { void(^blockOne)(void) = ^(void){ NSLog(@"this is blockOne"); }; blockOne(); }能够看到,上面的代码,我们是在一个函数blockTestOne里定义了一个无返回值,无參数的block,叫做blockOne。然后我们紧接着在后面调用了这个blockOne。
由于我们的block没有參数。所以在写的时候还能够简写成:
-(void)blockTestOne { void(^blockOne)(void) = ^{ NSLog(@"this is blockOne"); }; blockOne(); }即省略了等号后面的參数列表。
控制台输出结果:
2⃣️接下来,我们定义一个有參数,无返回值的block:
-(void)blockTestTwo { void(^blockTwo)(int) = ^(int a){ NSLog(@"blockTwo == %d", a); }; blockTwo(20); }在这里,我们定义了一个无返回值。參数类型为int型的block变量,名为blockTwo。然后我们调用了blockTwo,传入參数20,控制台打印结果为:
3⃣️然后,我们再来定义一个有返回值,而且有參数的block:
- (void)blockTestThree { int (^blockThree)(int) = ^(int b){ NSLog(@"blockThree parameter == %d", b); return 10; }; NSLog(@"%d", blockThree(20)); <h2>}</h2>我们在这里定义了一个返回值为int型。而且參数为int型的block变量,然后block实现里面打印了他的參数,最后回返一个常量10;我们又在block打印了blockThree,而且给他传了个參数20。
控制台打印结果为:
在这里须要注意的是,由于我们定义的blockThree是有返回值的,所以当在他的实现中(即等号右边大括号中)。假设没有返回值return。编译器会直接给我们报错:
3. block的存储域。
看过我之前博客文章《block传值以及利用block封装一个网络请求类》点击打开链接的朋友一定好奇,为什么利用block定义的属性,要用copy特性?如图:
在这里我们来分析一下block的存储域。大家就了解了。先看一段代码:
- (void)testBlock { void(^blockOne)(void) = ^{ NSLog(@"this is blockOne"); }; int c = 10; void(^blockTwo)(void) = ^(void){ NSLog(@"this is blockTwo %d ", c); }; void(^blockThree)(void) = [[blockTwo copy] autorelease]; NSLog(@"blockOne address == %@", blockOne); NSLog(@"blockTwo address == %@", blockTwo); NSLog(@"blockThree address == %@", blockThree); }在上面这段代码中,我们分别定义了三个block变量。blockOne,blockTwo和blockThree,然后,我们分别打印了他们三个的地址,他们三个的差别是,blockOne实现的不过打印一句话,没有使用不论什么外部变量(block定义以外的变量),而blockTwo实现的是打印了一句话。并写使用了一个外部变量c,而blockThree实现的是将blockTwo拷贝一分即copy一下,然后控制台打印的结果例如以下:
非常奇怪的能够看到,这三个block分别属于三个内存区域,blockOne由于没有使用不论什么外部变量,他的存储区域在全局区。而blockTwo由于使用了外部变量,则一下子跑到了stack区即栈区,而blockThree由于copy了blockTwo。则变到了堆内存中。我们都知道。在全局区和堆里面存储的对象是相对安全的,可是在栈区存储的对象就相对危急。有可能在使用他的时候其对象已经被释放,造成野指针,导致程序的crash。所以,我们在使用blcok的成员变量或者属性的时候,要将其copy到堆内存中使用。
未完待续。。
。还有__block的使用,记得关注哦。今天实在太晚了。
。
。
相关文章
- ios学习之旅---指针也不难
- iOS 通过UIPanGestureRecognizer实现控件悬浮拖拽
- iOS上实现对HTTPS的支持
- iOS上线审核Bitcode的Crash解析
- 适合新人学习的iOS官方Demo
- 【零基础学习iOS开发】【01-前言】02-准备
- iOS开发学习笔记:基础篇
- 物联网设备安全1.3 使用iOS App控制灯光
- iOS开发技巧 - Size Class与iOS 8多屏幕适配(一)
- iOS Simulator功能介绍关于Xamarin IOS开发
- iOS学习之字符串(NSString)的截取、匹配、分隔
- iOS学习之字符串(NSString)的截取、匹配、分隔
- Hello_IOS ios开发transform属性
- iOS 原生二维码扫描和生成
- iOS学习笔记-自定义过渡动画
- iOS学习笔记-地图MapKit入门
- [译] 揭秘 iOS 布局
- iOS: 聊聊 Designated Initializer(指定初始化函数):NS_DESIGNATED_INITIALIZER
- IOS 播放动态Gif图片
- IOS 被拒 关于 iPhone running iOS 10.3.1 on Wi-Fi connected to an IPv6 network.
- iOS NSInvocation的学习
- 【AGC】如何集成华为AGC性能管理- iOS
- ios学习之旅---c语言函数
- iOS UISearchDisplayController学习笔记
- iOS开发 -- 在Xcode中引入cpp文件,并调用cpp文件中的方法
- iOS - 封装自己的slider
- iOS开发 - 写一个刷新的控件(未封装,适合新手学习,查看原理)
- iOS - 开源框架、项目和学习资料汇总(动画篇)
- 学习Coding-iOS开源项目日志(一)
- <极客学院>视频教程学习笔记-iOS中CALayer的使用
- 《慕客网:IOS基础入门之Foundation框架初体验》学习笔记 <四> NSMutableArray
- iOS聊天起泡(背景图片被拉伸不变形)----转载--待验证
- 苹果宣布创立欧洲首个iOS开发中心
- iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem