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开发中积累的常用代码. 立即下载

相关推荐

保姆级教程:在RK3588 Android12设备树(DTS)中配置MIPI 8 Lane双通道与DSC显示

本文详细介绍了在RK3588 Android12平台上配置MIPI 8 Lane双通道与DSC显示的实战指南。通过设备树(DTS)参数详解、DSC参数计算与PPS配置、双通道同步机制实现等内容,帮助开发者高效完成高分辨率屏幕驱动配置,解决嵌入式显示系统开发中的常见挑战。

weixin_30905133的博客 399

OC 自定义代码块

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

菜鸟小扎 914

从传统扫描到SSN:Tessent数据包技术如何减少90%测试时间

本文深入探讨了Tessent流式扫描网络(SSN)如何通过其核心的数据包技术,彻底改变芯片测试范式。该技术将测试数据封装成标准化数据包,在共享总线上进行智能路由与分发,实现了动态带宽分配与核心独立测试,从而将复杂SoC(如AI芯片)的总体测试时间大幅削减90%,并显著提升测试灵活性与可扩展性。

meat5的博客 490

OC语法之浅谈block

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

IcdKnight的博客 839

深度学习、图像分类入门,从VGG16卷积神经网络开始

刚开始接触深度学习、卷积神经网络的时候非常懵逼,不知道从何入手,我觉得应该有一个进阶的过程,也就是说,理应有一些基本概念作为奠基石,让你有底气去完全理解一个庞大的卷积神经网络: 本文思路: 一、我认为学习卷积神经网络必须知道的几个概念: 1、卷积过程:   我们经常说卷积神经网络卷积神经网络,到底什么才是卷积?网络层卷积过程到底怎么实现?我们在这里借鉴了另一位博客大牛的动态图来给大

Errors_In_Life的博客 16万+

GRCNN抓取网络学习3【自制Jacquard数据集模型调优】

请先完成,这样有利于下面操作的理解!然后第二步是,有了自己的数据集输入到GRCNN中是三种文件,那么可以GRCNN抓取网络学习2【自制Jacquard数据集训练】!既然学会训练,那么开展下一步计划模型调优。GRCNN源码:https://github.com/skumra/robotic-grasping。

vor234的博客 2502

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

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

qq_25842885的专栏 488

YOLOv13涨点改进 | 全网独家创新、HyperACE改进、注意力改进篇 | CVPR 2025| 引入LRSA局部区域自注意力模块,能提升其在细节捕捉、小目标检测和长距离依赖建模方面的能力

本文提出将LRSA(局部区域自注意力)模块集成到YOLOv13中,通过局部特征交互增强细节捕捉能力、小物体检测精度和长距离依赖建模。LRSA模块采用重叠图像块处理策略,在保持计算效率的同时提升复杂背景下的检测性能。文章详细介绍了模块结构、原理优势,并提供了三种改进方案:1)在主干网络添加LRSA层;2)将关键模块替换为DSC3k2_LRSA;3)采用HyperACE_LRSA结构。配套提供了完整的PyTorch实现代码和YAML配置文件,展示了该模块如何通过局部注意力机制平衡检测精度与推理速度。

Ai缝合怪、助力小伙伴高效发论文 345

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

一文搞懂LDO !

Start-up 时间是 IC 做死的,如果想要延时启动,最简单的办法是在 EN 上接一个大一些的电容到地,构成一个简单的 RC 电路。电容太小,电压跌落大,响应快。输出电流高,功率大;外围器件少,电路简单,成本低,负载响应快,输出纹波小;将采集的电压输入到比较器反向输入端,与正向输入端的基准电压(期望输出的电压)进行比较,再将比较结果进行放大;是指在给定负载变化下的输出电压的变化,这里的负载变化通常是从无负载到满负载。芯片的静态电流大小与其他性能成反关系,如低噪声,高电源电压抑制比,静态电流大。

weixin_46969363的博客 4384

鸿蒙录屏推流应用完整解决方案

本文介绍了鸿蒙录屏推流应用的完整解决方案。项目采用分层架构设计,包含录屏、编码、推流等功能模块,要求实现4小时稳定运行且延迟小于3秒。技术实现包括:1) 通过config.json配置应用权限和功能;2) 使用ScreenRecorderManager类管理录屏服务,实现视频采集、音频录制和编码参数配置;3) 核心功能包含初始化录屏器、开始/停止录屏等操作。该方案充分利用鸿蒙系统的多媒体API,实现了高性能的屏幕录制与实时推流功能。

huanghm88的专栏 289

OC之代码块

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

小白的逆袭~ 1022

MSP430FR6043超声波传感器设计记录

1.前言 最近项目设计了一个超声波传感器 参考TI官方的板子EVM430-FR6043搭建的电路 EVM430-FR6043评估模块是一个用于评估MSP430FR6043 MCU性能的开发平台。 MSP430FR6043 MCU是一款超低功耗器件, 集成了超声波感测模拟前端 用于精确地进行超声波测量。 专为超声波水表、热量计和燃气表而设计, MSP430FR6043 器件采用低功耗加速器 (LEA), 可实现基于高速 ADC 的信号采集以及后续优化数字信号处理, 为电池供电型计量提供了一款超低功耗、高

bingdund的博客 2865

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

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

dishuangqing3232的博客 138

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

objective-c 中代码块(blocks)

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

明明 670

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

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

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

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

weixin_30444105的博客 396

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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、付费专栏及课程。

余额充值