`

objective-c ——代码块

阅读更多

通过代码块(block)功能,你就能像对待对象一般,指定要在方法和函数中传递任意代码部分。

代码块的声明:

int main (int argc, const char * argv[])
{

@autoreleasepool {

void (^myBlock) (NSString *x);//声明变量

/*

代码块是存储在一个变量中,并且需要参数和声明的返回类型。

返回类型:(本类是void)声明代码块的返回值类型的位置所声明变量的类型定义在同一个地方。在代码块声明中声明的值类型就是代码块执行时的返回值类型。

特殊字符^:它告诉编译器所定义的时代码块而不是其他类型的变量。

变量名:(这里时myBlock)存储代码块的变量名,这个变量名使用小括号同其后面的参数隔开。

代码块变量的命名规则和其他变量的命名规则是一样的,必须仅包含数字,字母和下划线,但不能以数字打头。

传入到代码块的参数列表:无需提供参数的变量名,多个参数要用逗号隔开。

分号结束。

*/
myBlock = ^(NSString *x)
{
NSLog(@”%@”,x);
};//通过赋值操作利用代码块初始化一个新变量

/*

代码块的定义再次使用^字符,来告诉编译器接下来的内容是代码快的定义。

在定义中可以省略返回值类型,因为编译器可以从存储代码块的变量确定返回值类型。

必须提供代码块的参数说明。

代码块的函数体:位于参数列表的右括号后边,函数体用大括号括起来,可以执行指定的任何操作,在需要时使用参数并在结束后返回适当的值。

*/

}
return 0;
}

前面介绍了代码块的声明和定义,本次将介绍代码块的使用。

在这里分享一个网上链接:http://blog.sina.com.cn/s/blog_71715bf8010166ux.html
1、参数是NSString*的代码块

void (^printBlock)(NSString *x);
printBlock = ^(NSString* str)
{
NSLog(@”print:%@”, str);
};
printBlock(@”hello world!”);

运行结果是:print:hello world!

2、代码用在字符串数组排序

NSArray *stringArray = [NSArray arrayWithObjects:@"abc 1", @"abc 21", @"abc 12",@"abc 13",@"abc 05",nil];
NSComparator sortBlock = ^(id string1, id string2){
return [string1 compare:string2];
};
NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock];
NSLog(@”sortArray:%@”, sortArray);

运行结果:sortArray:(
“abc 05″,
“abc 1″,
“abc 12″,
“abc 13″,
“abc 21″
)

3、代码块的递归调用

代码块想要递归调用,代码块变量必须是全局变量或者是静态变量,这样在程序启动的时候代码块变量就初始化了,可以递归调用

static void (^ const blocks)(int) = ^(int i)
{
if (i > 0) {
NSLog(@”num:%d”, i);
blocks(i – 1);
}
};
blocks(3);

运行打印结果:

num:3
num:2
num:1

4、在代码块中使用局部变量和全局变量

在代码块中可以使用和改变全局变量

int global = 1000;
int main(int argc, const char * argv[])
{
@autoreleasepool {
void(^block)(void) = ^(void)
{
global++;
NSLog(@”global:%d”, global);
};
block();
NSLog(@”global:%d”, global);
}
return 0;
}

运行打印结果:

global:1001
global:1001

而局部变量可以使用,但是不能改变。

int local = 500;
void(^block)(void) = ^(void)
{
local++;
NSLog(@”local:%d”, local);
};
block();
NSLog(@”local:%d”, local);

在代码块中改变局部变量编译不通过。怎么在代码块中改变局部变量呢?在局部变量前面加上关键字:__block

__block int local = 500;
void(^block)(void) = ^(void)
{
local++;
NSLog(@”local:%d”, local);
};
block();
NSLog(@”local:%d”, local);

运行结果:local:501

以上1,2,3,4部分都为该作者所写,觉得不错就搬过来了,在此再稍微补充几点:

5,代码块为函数形参时的情况

声明一个接受代码块参数的函数

void useCodeBlock(NSComparisonResult (^aBlock) (NSString *value));

使用代码块

void useCodeBlock(NSComparisonResult (^aBlock) (NSString *value))
{
if (NSOrderedSame == aBlock(@”foo”))
NSLog(@”They are the same.”);
else
NSLog(@”They are not the same”);
}

6,在对象或类方法中使用代码块

-(NSMutableArray *)filterArray:(NSArray *)inArray withBlock:(BOOL (^) (NSInteger))block{
NSMutableArray *result = [NSMutableArray array];
for(NSNumber *number in inArray)
{
if(block([number integerValue]))
[result addObject:number];
}
return result;
}

注意:我们是在代码块定义之后才传入代码块参数的名称(保存代码块的变量在方法体内使用的名称),因此,通常在代码块定义时需要提供代码块变量名的位置却仅传入^符号。(联系代码块的定义)。

专注iOS分享网 http://iosshare.cn

分享到:
评论

相关推荐

    [Objective-C编程(第6版)]Programming in Objective-C

    - **特点**:Objective-C支持类、消息传递、继承等面向对象编程特性,并与C语言兼容,允许开发者直接在Objective-C代码中使用C代码。 ##### 2. 基础语法 - **变量和数据类型**:Objective-C支持多种内置数据类型,...

    Objective-C基础教程(第2版)

    1. Objecitve-C最新特性:代码块、ARC、类扩展; 2. 新增工具Clang静态分析器和GCD; 3. 如何使用UIKit框架开发精致的iOS应用程序; 4. 如何使用最新版本的Xcode。 无论你是初次接触Objective-C和Cocoa,...

    IOS应用源码——Objective-C基础教程 随书源码.zip

    6. **Block(块)**:Objective-C的块是一种匿名函数,常用于异步操作或作为参数传递。理解Block的定义、使用和作用域规则。 7. **内存管理**:了解ARC(Automatic Reference Counting)自动引用计数,它是...

    Programming in Objective-C - 6th Edition

    ### 编程在Objective-C —— 第六版 #### 关键知识点概述 1. **Objective-C简介** - **语言特点**:Objective-C是一种通用、面向对象的编程语言,它扩展了标准C语言,增加了面向对象功能和支持动态消息传递。 - ...

    从C++到 Objective-c

    - **Objective-C** 允许在代码块的中间位置声明变量,这为编写更灵活的代码提供了便利。 综上所述,Objective-C作为一种面向对象的语言,既继承了C语言的强大基础,又引入了许多面向对象的新概念和技术。通过对...

    Objective-C基础教程

    Objective-C是在C语言的基础上扩展的,它引入了消息传递机制,使得对象间的通信更为灵活。在Objective-C中,一切皆为对象,每个对象都有其特定的类定义,类是对象的模板。类定义包括属性(ivar)和方法(method),...

    Objective-C培训资料

    - **浅复制与深复制**: Objective-C提供了两种复制对象的方式——浅复制和深复制。浅复制只复制对象的引用,而深复制则复制整个对象及其所有属性。 #### 十三、归档 - **归档**: 归档是一种将对象序列化到磁盘文件...

    Objective-C语法总结(第一版).zip

    Objective-C起源于C语言,因此它包含了C的所有特性,并扩展了面向对象的功能。这份“Objective-C语法总结(第一版)”的资料很可能是对这个编程语言的关键概念和语法结构的一个全面概述。 首先,Objective-C中的核心...

    多库俄罗斯方块Objective-c版本

    《多库俄罗斯方块Objective-c版本》是一款基于Objective-C编程语言开发的经典游戏——俄罗斯方块。Objective-C是苹果公司为其操作系统macOS和iOS所设计的一种面向对象的编程语言,它是C语言的超集,增加了Smalltalk...

    Objective-C-2.0程序设计-第9章-多态、动态类型和动态绑定PPT课件.ppt

    当可能出现异常的代码块被`@try`包围时,如果发生异常,相应的`@catch`块会捕获它。`@finally`块则确保不论是否捕获到异常,某些代码都会被执行。虽然Objective-C不鼓励频繁抛出异常,但在处理多态和动态绑定时,...

    Object-C 入门教程-object-c如何学习

    Objective-C的类语法和设计主要借鉴自Smalltalk——最早的面向对象编程语言之一。对于那些已经熟悉其他面向对象编程语言的人来说,Objective-C提供了许多传统面向对象的概念,如封装、继承和多态等。尽管存在一些...

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码《Objective-C编程之道:iOS设计模式解析》是基于iOS的软件开发指南。书中应用GoF的经典设计模式,介绍了如何在代码中应用创建型模式、结构型模式和行为模式,...

    xcode-macros-cheatsheet.pdf.zip_Windows编程_Objective-C_

    《Xcode宏速查表——Objective-C编程指南》 在苹果的开发环境中,Xcode扮演着核心角色,它是iOS和macOS应用开发的主要工具。本资料“xcode-macros-cheatsheet.pdf”是一个专为Mac开发者设计的Xcode宏速查表,旨在...

    Objective C Programming The Big Nerd Ranch Guide 2nd Edition(英文版)

    Block(代码块)是Objective-C的一个重要特性,允许开发者在代码中定义可重用的代码片段。在多线程编程中,Blocks的使用非常常见,例如在GCD(Grand Central Dispatch)中。书中会详细阐述Block的定义、使用场景及其...

    Object C 面向对象编程

    Objective-C支持类和对象的重用,使得开发者可以创建通用代码块,并在多个项目中重用。 8. 抽象机制:在OOP中,抽象涉及隐藏对象复杂性的过程,只展示与特定任务相关的必要信息。Objective-C通过封装来实现抽象,将...

    Objective C开发教程

    本教程旨在深入探讨Objective-C编程语言的核心概念和技术要点,并为开发者提供一个坚实的起点,以进一步探索苹果Mac OS X平台下的Objective-C应用框架——即所谓的Cocoa环境。以下是对该文档内容的一个详尽总结与...

    Xcode 开发人员入门导引

    - **if语句**:介绍如何根据不同的条件执行不同的代码块。 - **switch语句**:学习如何使用switch语句处理多个条件的情况。 ##### 8. **第7章:循环** - **for循环**:教授如何使用for循环来重复执行一段代码。 - ...

    IOS应用源码——nluchkin-Sosial-Blocks-497fe69.zip

    Block在Objective-C和Swift中都是重要的特性,它允许我们将代码块作为参数传递,简化异步操作的处理。此外,源码中可能还涉及了数据持久化、网络请求、UI动态加载等常见的iOS开发技术。 总之,"IOS应用源码——...

    Java Objective C Encrypt/Decrypt Eclipse and XCode Project and Source Code

    本项目提供了在Eclipse(Java)和XCode(Objective-C)环境中进行加密和解密的示例代码,涵盖了DES,3DES,AES128,AES256以及RSA等主流的加密算法。这些算法在信息安全、数据保护以及网络通信中扮演着至关重要的...

    iOS游戏应用源代码——itarato-HexGuess-8a281fb.zip

    《iOS游戏应用源代码解析——itarato-HexGuess》 在iOS开发领域,源代码是开发者们的宝贵财富,它能够揭示应用程序的内部运作机制。本文将深入探讨名为itarato-HexGuess的游戏应用源代码,该代码位于压缩包...

Global site tag (gtag.js) - Google Analytics