objective-c+中代码块(blocks)

深入理解Objective-C的Blocks和类层次结构 本文深入探讨了Objective-C中的Blocks编程特性和类的继承机制。首先,解释了Blocks如何在未来的不确定时刻执行,以及如何通过__block限定符来处理局部变量的作用域问题。接着,文章详细描述了Blocks在延迟执行和创建单例中的应用。其次,通过对类和子类的讨论,揭示了Objective-C中类如何通过继承共享功能,并展示了如何在Xcode中浏览类的层次结构。文章最后强调了在编写Objective-C代码时,interface和implementation的重要性,以及如何声明类的继承。 阅读详情

 原文地址:http://blog.sina.com.cn/s/blog_67419c420100vl8b.html

 在ios4之后,引入了代码块的特性,在gcd中会经常的用到,所以决定好好的看看代码块文档,把这块总结一下。从头开始讲解代码块。


1.声明和使用代码块
一般用^操作符声明一个块变量,并作为块的开始符。而块的本身用{}包括起来,就像下面那样。
 int multiplier = 7;
 int (^myBlock)(int) = ^(int num) {
 return num * multiplier;
 };

下面的图是详细的讲解:

       其实意思就是前半句声明了一个名字为myBlock的代码块,有一个int类型的参数,并返回一个int类型的值;后面的半句就是一个块的定义,然后赋值给myBlock。
      如果我们像上面那样,声明一个块像一个变量一样,我们就可以像使用函数一样使用它,如下:
 int multiplier = 7;
 int (^myBlock)(int) = ^(int num) {
 return num * multiplier;
 };
 
 printf("%d", myBlock(3));
 // prints "21"


2.直接使用block
在大多数情况下,我们不需要去声明一个块变量,我们直接写一个简单的代码块作为参数传递就行。下面的代码函数qsort_b的第三个参数就是一个代码块。
 char *myCharacters[3] = { "TomJohn", "George", "Charles Condomine" };
 
 qsort_b(myCharacters, 3, sizeof(char *), ^(const void *l, const void *r) {
 char *left = *(char **)l;
 char *right = *(char **)r;
 return strncmp(left, right, 1);
 });
 
 // myCharacters is now { "Charles Condomine", "George", "TomJohn" }

    一些cocoa frameworks的方法采用一个block作为一个参数,典型的是对一个集合对象进行操作,或者是在一个操作完成之后使用回调。下面的例子是NSArray类的方法 sortedArrayUsingComparator:怎样使用一个block。此方法使用一个block作为一个参数。
 NSArray *stringsArray = [NSArray arrayWithObjects:
 @"string 1",
 @"String 21",
 @"string 12",
 @"String 11",
 @"String 02", nil];
 
 static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |
 NSWidthInsensitiveSearch | NSForcedOrderingSearch;
 NSLocale *currentLocale = [NSLocale currentLocale];
 
 NSComparator finderSortBlock = ^(id string1, id string2) {
 
 NSRange string1Range = NSMakeRange(0, [string1 length]);
 return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];
 };
 
 NSArray *finderSortArray = [stringsArraysortedArrayUsingComparator:finderSortBlock];
 NSLog(@"finderSortArray: %@", finderSortArray);
 
 

block的一个强大的功能是可以修改同一作用雨的变量,我们只需要在变量的前面加上一个_block标识符。下面的例子和上面的相同,只是添加功能用于记录相同元素的个数。
 NSArray *stringsArray = [NSArray arrayWithObjects:
 @"string 1",
 @"String 21", // <-
 @"string 12",
 @"String 11",
 @"Strîng 21", // <-
 @"Striñg 21", // <-
 @"String 02", nil];
 
 NSLocale *currentLocale = [NSLocale currentLocale];
 __block NSUInteger orderedSameCount = 0;
 
 NSArray *diacriticInsensitiveSortArray = [stringsArray sortedArrayUsingComparator:^(id string1, id string2) {
 
 NSRange string1Range = NSMakeRange(0, [string1 length]);
 NSComparisonResult comparisonResult = [string1 compare:string2 options:NSDiacriticInsensitiveSearch range:string1Range locale:currentLocale];
 
 if (comparisonResult == NSOrderedSame) {
 orderedSameCount++;
 }
 return comparisonResult;
 }];
 
 NSLog(@"diacriticInsensitiveSortArray: %@", diacriticInsensitiveSortArray);
 NSLog(@"orderedSameCount: %d", orderedSameCount);
 
 

3.block变量的声明
block的声明和函数指针差不多,只是把*改为了^
 void (^blockReturningVoidWithVoidArgument)(void);
 int (^blockReturningIntWithIntAndCharArguments)(int, char);
 void (^arrayOfTenBlocksReturningVoidWithIntArgument[10])(int);
也可以使用typedef去声明block,方便以后使用,如下:
 typedef float (^MyBlockType)(float, float);
 
 MyBlockType myFirstBlock = // ... ;
 MyBlockType mySecondBlock = // ... ;

4.变量的作用域对于其在块中的影响:
 _block int x = 123; // x lives in block storage
 
 void (^printXAndY)(int) = ^(int y) {
 
 x = x + y;
 printf("%d %d\n", x, y);
 };
 printXAndY(456); // prints: 579 456
 // x is now 579

 extern NSInteger CounterGlobal;
 static NSInteger CounterStatic;
 
 {
 NSInteger localCounter = 42;
 __block char localCharacter;
 
 void (^aBlock)(void) = ^(void) {
 ++CounterGlobal;
 ++CounterStatic;
 CounterGlobal = localCounter; // localCounter fixed at block creation
 localCharacter = 'a'; // sets localCharacter in enclosing scope
 };
 
 ++localCounter; // unseen by the block
 localCharacter = 'b';
 
 aBlock(); // execute the block
 // localCharacter now 'a'
 }

5.使用blocks
(1)调用一个声明好的block
 int (^oneFrom)(int) = ^(int anInt) {
 return anInt - 1;
 };
 
 printf("1 from 10 is %d", oneFrom(10));
 // Prints "1 from 10 is 9"
 
 float (^distanceTraveled) (float, float, float) =
 ^(float startingSpeed, float acceleration, float time) {
 
 float distance = (startingSpeed * time) + (0.5 * acceleration * time * time);
 return distance;
 };
 
 float howFar = distanceTraveled(0.0, 9.8, 1.0);
 // howFar = 4.9

 

oc常用代码 ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码,ios开发中积累的常用代码. 立即下载

相关推荐

51单片机独立按键控制LED(二)

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。独立按键控制LED显示二进制。独立按键控制LED灯亮灭。独立按键控制LED状态。独立按键控制LED移位。

m0_50562428的博客 5381

OC 自定义代码块

1.如下图所示,编写需要进行代码块的代码,并将其拖入指定位置; 2.如下图所示,找到所要编辑的代码块(默认名字为“My Code Snippet”),并点击编辑按钮; 3.如下图所示,编辑代码块各属性信息; 4.编辑代码块自定义字段,并点击done按钮; //将需要自定义的字段外加上尖括号和井号 //例如-(void)set#Name#>:(); //则在代码块中会显示为-

菜鸟小扎 914

【hadoop编译报错】(yarn install) on project hadoop-yarn-applications-catalog-webapp Failed to run task

ambari+bigtop自定义组件集成

TTBIGDATA的博客 1803

OC语法之浅谈block

OC语法之浅谈blockblock基本介绍block应用场景block直接使用声明和定义分开声明和定义放一起block作属性block作方法的参数block作返回值完整demo示例 block基本介绍 block对象是一段代码,和C语言函数类似,都是在一个花括号内的一套指令,但是它没有函数名,相应位置只有一个^ 符号,^ 表示这段代码是一个block对象。下面是一个block示例: ^{ NSLog(@"这是一个block语句"); } 我们可以简单理解为函数指针,即代码块的内存地址。block常用作传

IcdKnight的博客 839

RV1106G3的AOV下的yolov5调试记录

本文介绍了基于LuckFoxPicoMax开发板的RV1106芯片调试经验,重点包括AOV(Always-On Vision)和Yolov5目标检测的实现。在硬件方面,板载1TOPS NPU、256MB内存,并更换为SPI NOR存储。软件调试涉及MK配置文件修改、设备树调整(按键唤醒和sensor配置)以及程序自启动设置。Yolov5模型优化为320*320尺寸,推理时间约45ms。系统采用VI采图与AI识别通过共享内存通信的方案,实测功耗在20-35mA范围。文章还指出了当前存在的功耗优化、ISP调试等

fzktongyong的博客 1712

Linux双网卡设置IP属于同一网段的ping方法以及现象记录分析

文章目录前言ping以及MAC地址总结 前言 写在前面:经常遇到客户将板卡上的两个网络设备的IP地址设置为同一网段的情况,比如eth0:192.168.0.232,eth1:192.168.0.30. 我的解释是,不能设置为同一网段,或者使用其中一个时候下线另外一个网卡。但是我不知道这个说法到底是根据什么,查了很多资料也没找到明确的说法,但是下面这个实验能够说明一些现象的原因。 ping以及MAC地址 首先查看网卡的信息 ifconfig 因为两个网卡都在同一个网段,所以如果这个时候直接和我们的主机(I

“逛丢一只鞋”的博客 1万+

黑马程序员——ObjC基础—其他封装

-----------Java培训、Android培训、IOS培训、.Net培训、期待与您交流!------------  本节来学习一下OC中对基本数据类型以及代码块的封装。 1、Block封装 在OC中,采用Block代码块来对c语言函数进行封装,以扩充c函数的适用范围,我们用c语言定义一个sum函数: int sum(int a, int b){ retu

qq_25842885的专栏 488

利用SPSS实现逻辑回归,树模型,以及广义线性模型

本案例是IBM SPSS数据分析与挖掘实战案例精粹----第九章的学习记录 案例背景:分析出导致急救后迟发性颅脑损伤的主要影响因素,共有201项案例: 分析思路:先使用logistic回归模型进行影响因素筛选,然后利用分类树探索自变量中是否存在交互作用,最后利用广义线性模型过程拟合带交互项的Logistic回归模型 字段:性别,年龄,收缩压,舒张压,血小板,脑挫伤,中线位移,脑肿胀,入院意识,是否手术急救,其余急救措施,是否出现迟发性脑损伤; ...

hepan_defeng的博客 1万+

c++ Eigen之block

块 block 定义 Block of size (p,q), starting at (i,j) 动态大小 matrix.block(i,j,p,q); 固定大小 matrix.block<p,q>(i,j) 示例 右值 #include <Eigen/Dense> #include <iostream> using namespace std; int main() { Eigen::MatrixXf m(4,4); m <<

console的博客 2102

解决redhat8/centos8无法使用yum问题(报错:This system is not registered to Red Hat Subscription Management)

解决redhat无法使用yum问题、以及替换repo文件后仍无法使用yum的问题

qq_43569119的博客 4342

DAP-Link DIY复刻指南

DAP-Link是ARM开源的一个项目,主要用于代码下载以及调试,支持SWD和JTAG调试接口,对于开发嵌入式的同学相信都或多或少有所耳闻。除了DAP-Link之外还有很多同类型的调试器,如ST-LinkJ-Link,但是这些都是不开源的,无法复刻或进行二次开发。但DAP-Link不同,完全开源,不用担心侵权问题,且随着开源社区大家的共同努力,DAP-Link经过了不断的迭代,先如今已取代ARM之前推出的CMSIS-DAP开源项目。

爱出名的狗腿子 1万+

OC之代码块

block block 允许开发者在两个对象之间将任意语句当做数据进行传递 block 使用了与一个函数相同的机制:可以像声明一个函数一样来声明一个block; 可以像定义个函数的方法一样来定义一个block,也可以将block当做一个对象来调用//代码块的声明: // 返回值类型(^代码块的名称)(参数列表); //代码块的实现: // 代码块的

小白的逆袭~ 1022

FPGA DDR3实战(四):DDR地址映射自动化测试(1)—— 测试程序设计与代码逻辑

本文介绍了一种DDR地址映射自动化测试方案,旨在提高板卡调试效率。方案通过AXI4协议实现主从端通信,构建了包含地址控制器和测试数据生成器的模块化架构。测试程序支持突发传输、状态监控和错误检测,可灵活配置测试参数。采用状态机控制流程,先写入递增数据再读取比对,完成功能验证和性能评估。该方案可系统化验证DDR的正确性、稳定性和可靠性,相比传统手动测试显著提升效率。

FPGA_小田老师的博客 1977

【转】objective-c 中代码块(blocks)

转自:http://blog.sina.com.cn/s/blog_67419c420100vl8b.html 在ios4之后,引入了代码块的特性,在gcd中会经常的用到,所以决定好好的看看代码块文档,把这块总结一下。从头开始讲解代码块。 1.声明和使用代码块 一般用^操作符声明一个块变量,并作为块的开始符。而块的本身用{}包括起来,就像下面那样。 ...

dishuangqing3232的博客 138

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

objective-c 中代码块(blocks)

在ios4之后,引入了代码块的特性,在gcd中会经常的用到,所以决定好好的看看代码块文档,把这块总结一下。从头开始讲解代码块。 1.声明和使用代码块 一般用^操作符声明一个块变量,并作为块的开始符。而块的本身用{}包括起来,就像下面那样。 int multiplier = 7; int (^myBlock)(int) = ^(int num

明明 670

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

RT-Thread Studio + STM32CubeMX 联合开发避坑指南:搞定W25Q32 SPI Flash的SFUD与FAL配置

本文详细解析了RT-Thread Studio与STM32CubeMX联合开发中W25Q32 SPI Flash的SFUD与FAL配置问题,提供从环境搭建到高级优化的全流程解决方案。重点解决SPI接口配置、SFUD驱动与FAL组件集成中的常见陷阱,帮助开发者高效完成嵌入式存储系统开发。

weixin_30444105的博客 396

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

objective c 代码块blocks完整总结一

在ios4之后,引入了代码块的特性,在gcd中会经常的用到,所以决定好好的看看代码块文档,把这块总结一下。从头开始讲解代码块。 1.声明和使用代码块 一般用^操作符声明一个块变量,并作为块的开始符。而块的本身用{}包括起来,就像下面那样。 int multiplier = 7; int (^myBlock)(int) = ^(int n...

weixin_30633507的博客 87

objective-c ——代码块

通过代码块(block)功能,你就能像对待对象一般,指定要在方法和函数中传递任意代码部分。 代码块的声明: int main (int argc, const char * argv[]) { @autoreleasepool { void (^myBlock) (NSString *x);//声明变量 /* 代码块是存储在一个变量中,并且需要参数和声明的返回类型。 返回类型:...

关东升 132

Working with Blocks

简介Blocks是C语言层级语法和运行时特性。 它们类似于标准C函数,但是除了可执行代码之外,它们还可以保存堆栈变量。 因此,块可以保存数据,在代码执行时使用。 1、Block可以作为函数数调用、作为函数参数、作为方法参数。 2、因为独立完整可以在多线程中使用; 3、因为拥有回调时需要执行的代码和执行代码时需要的数据,常常被用来实现回调Callback。 由于Objective-C和C++都

ZWQ0325的博客 806
上一篇: 得到某个月的天数 Objective-C方式实现
下一篇: Objective-C入门(Learning Objective-C)
NickTang
博客等级 码龄24年 261粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值