代码块本质上是和其他变量类似。不同的是,代码块存储的数据是一个函数体。使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值。
脱字符(^)是块的语法标记。按照我们熟悉的参数语法规约所定义的返回值以及块的主体(也就是可以执行的代码)。下图是如何把块变量赋值给一个变量的语法讲解:
[img]
[/img]
按照调用函数的方式调用块对象变量就可以了:
int result = myBlock(4); // result是 28
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、在代码块中使用局部变量和全局变量
4.1在代码块中可以使用和改变全局变量
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
local:501
- 大小: 68.7 KB
分享到:
相关推荐
书中还可能涵盖Block(代码块)的使用,这是Objective-C中一种强大的语法特性,常用于多线程和异步编程,因为它可以捕获和封装变量的上下文。另外,可能会讲解到Cocoa Touch和Cocoa框架中的线程安全类和方法,以及...
块(Block)是Objective-C中的匿名函数,可以在代码中定义并立即使用,类似于其他语言的lambda表达式。它们对于处理异步操作,如网络请求,非常有用。 Foundation框架是Objective-C的基础,提供了许多基础类,如...
### Objective-C基础语法学习项目详解 #### 一、Objective-C简介 Objective-C是一种面向对象的编程语言,由Smalltalk和C语言发展而来。它在20世纪80年代初被设计出来,并在苹果公司开发iOS和macOS应用程序时得到了...
还可能讲解了Objective-C的特殊特性,如类别(Category)、协议(Protocol)和块(Block)。 2. **语法结构**:Objective-C的语法有其独特性,比如它的方法定义和调用方式,以及在C语言基础上添加的“@”符号,如@...
6. **Block(块)**:Objective-C的块是一种匿名函数,常用于异步操作或作为参数传递。理解Block的定义、使用和作用域规则。 7. **内存管理**:了解ARC(Automatic Reference Counting)自动引用计数,它是...
10. **Block(闭包)**:Objective-C支持块语法,`FractionDemo`可能包含使用块作为参数或返回值的方法,用于实现异步操作或回调。 这些只是Objective-C编程中的一部分核心概念,实际的`FractionDemo`代码会根据...
Objective-C是一种面向对象的编程语言,它是在C语言的基础上扩展了Smalltalk的类和消息传递机制,由Stepstone公司于1983年开发,并在苹果的Mac OS X和iOS操作系统上广泛使用。这个压缩包文件包含了一系列关于...
Block(块)是Objective-C的匿名函数,可以作为参数传递,也可以作为返回值。它们在处理异步任务、排序和过滤数组等方面非常有用。 此外,Foundation框架是Objective-C开发的基础,提供了许多基本的数据类型和实用...
在Objective-C 2.0中,引入了一些重要的改进,如Block(代码块)和ARC(自动引用计数)。Block允许在代码中定义可复用的匿名函数,使得处理回调和并发更加方便。ARC则自动化了内存管理,减少了手动内存管理导致的...
1. Block:Objective-C支持块(Block),一种内联函数,可以捕获并存储其所在作用域的变量。常用于异步编程。 2. GCD(Grand Central Dispatch):苹果提供的多线程解决方案,使用Block简化并发编程。 七、...
Objective-C是在C语言的基础上扩展的,它保留了C的语法结构,并添加了面向对象编程的特性。在学习Objective-C时,你需要了解C语言的基本概念,如变量、数据类型、控制结构等。同时,Objective-C引入了消息传递机制,...
1. **语法特性**:Objective-C是在C语言的基础上扩展的,保留了C的语法特性,同时引入了消息传递机制,使得它具有面向对象的能力。 2. **类和对象**:Objective-C中的所有数据结构都是基于类的,类是对象的模板,而...
- **特点**:Objective-C支持类、消息传递、继承等面向对象编程特性,并与C语言兼容,允许开发者直接在Objective-C代码中使用C代码。 ##### 2. 基础语法 - **变量和数据类型**:Objective-C支持多种内置数据类型,...
Objective-C是在C语言基础上扩展的,它引入了消息传递机制和类的概念,使得C语言具备了面向对象的能力。Objective-C的语法在某些方面与C++相似,但它的动态性更强,允许在运行时修改类和方法。 2. **类与对象**: ...
这些控制结构可以帮助开发者根据不同的条件来执行相应的代码块。 ##### 2.3 函数与方法 在Objective-C中,通常将函数称为“方法”,并且它们被定义在类中。例如: ```objective-c // 函数声明 - (void)printHello...
- **与C语言兼容:** Objective-C保留了C语言的所有特性,并在此基础上进行了扩展,因此可以轻松地在Objective-C代码中使用C语言编写的库或代码。 #### 二、Objective-C语言的基础语法 **1. 类与对象** 在...
Objective-C 2.0 是苹果公司开发的一种面向对象的编程语言,它是C语言的超集,主要用于iOS和macOS的应用程序开发。Objective-C 2.0在Objective-C的基础上添加了一些新特性,使得代码更加简洁易读,提高了开发效率。...
这个"Objective-C 基础教程 源代码"是为初学者设计的,旨在帮助他们理解并掌握Objective-C的基本概念、语法和编程技巧。通过学习这些源代码,你可以亲手实践编程,加深对语言特性的理解。 1. **Objective-C简介**:...
6. **Blocks和GCD**:Objective-C支持块(Block)语法,这是一种强大的匿名函数形式,常用于并发编程。Grand Central Dispatch(GCD)是Apple提供的多线程解决方案,结合Blocks可以方便地实现异步任务。 7. **...