在Object-C中,块的概念和我们熟知的函数式编程中的块概念一致,就是一个独立的逻辑处理单元,据说苹果公司为C,C++和Object-C都扩充了支持块的语法。苹果的系统是在Mac OSX10.6,iOS4.0以后支持块的。
在Object-C中,块被当做一个对象来处理,这个对象可以:
- 有自己的局部变量
- 可以传入参数
- 有返回值
- 可以访问自己定义时的上下文变量
- 可以修改自己定义时特定的上下文变量
- 作为参数传递给其它函数
在引入块特性之后,iOS4.0以后,很多新的API都使用了块做为参数来作为某个操作完成之后的回调。下面就来看一个例子:
- (Player *)playerAtPosition:(PlayerPosition)position {
__block Player *player;
[_players enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
player = obj;
if (player.position == position)
*stop = YES;
else
player = nil;
}];
return player;
}
这段代码的功能是在一个Dictionary中找到指定位置的玩家。代码中调用了SDK中NSDictionary类的方法:
- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);
该方法使用了一个块作为参数,表示遍历Dictionary中的每个对象时做的操作,以及什么时候停止遍历。
在例子代码中,还可以看到一个块的结构,块的定义分4部分:
- 'void'表示返回值为空;
- '(^)'表示接下来定义的是一个块;
- '(id key, id obj, BOOL *stop)'表示该块接受三个参数,他们的类型分别为对象,对象和布尔类型;
- '{…}'中的内容表示块的具体处理逻辑;
苹果官网上的图是这个样子的:
另外,代码中访问了方法的参数position,表示块可以访问自己定义时的上下文中的变量。
除此之外,块的代码中对上下文中的变量player进行了修改,因此在定义player变量时使用了'__block'关键字,表示该变量可以在块中修改。如果不加该关键字,编译器会报错“Assignment of read-only variable 'player'”。这是因为代码块内使用的是变量的副本,它是堆栈里的一个常量。这些变量在代码块中是不可改变的。。
其实,块从本质上来说是一个闭包,即其拥有代码逻辑和运行该段代码逻辑需要的变量。这一切在定义代码时就已经确定,因此,一个块在定义时访问了某个上文变量,即使之后该上下文变量发生了变化,块中仍然使用是定义时的值,可以认为块只是在定义的时候拷贝了一个变量值到自己的作用域。定义完之后,和原来的那个上下文变量就没有关系了。
NSDate *date = [NSDate date];
void (^time)(void) = ^ {
NSLog(@"The date and time is %@", date);
};
time();
NSLog(@"The date and time is %@", date);
sleep(10);
date = [NSDate date];
NSLog(@"The date and time is %@", date);//返回5秒后的新时间
time();//仍然返回上一次的时间
分享到:
相关推荐
- **类**:Objective-C中的基本构建块,定义了对象的属性(ivar)和方法(method)。 - **对象**:类的实例,具有特定的属性和行为。 2. **消息传递**: - Objective-C使用消息传递机制来调用对象的方法。当你写...
5. **Block(块)**:Objective-C 支持块,这是一种可以捕获和存储执行上下文的匿名函数。在 "ObjCTest" 中,我们可能会看到使用 Block 进行异步处理或者作为回调的例子。 6. **内存管理**:Objective-C 早期采用的...
4. **块(Block)**:Objective-C支持内联函数,即可以像变量一样被赋值、传递和存储的匿名函数,增强了代码的灵活性。 5. **动态类型(Dynamic Typing)**:Objective-C是动态类型的,意味着在编译时并不完全确定...
7. **块(Block)**:Objective-C支持块语法,用于定义匿名函数,常用于异步操作和回调。确保正确处理块的内存管理。 8. **异常处理**:Objective-C使用`@try`、`@catch`、`@finally`进行异常处理,但应谨慎使用,...
在Object-C中,你需要了解的关键概念还包括分类(Category)、协议(Protocol)和块(Block)。分类可以为已存在的类添加新的方法,而无需修改原始源代码。协议定义了一组可选的方法,类可以遵循协议以实现特定的...
3. **块(Block)**:块是Object-C中的闭包,可以捕获并存储其所在上下文的局部变量,常用于异步处理。 4. **分类(Category)**:通过`@interface className (categoryName)`声明分类,添加方法到已存在的类。 5....
Objective-C教程要点 基础语法:熟悉C语言基础是前提,Objective-C是在C语言的基础上增加了面向对象特性。...块与闭包:学习如何使用块(Block)实现闭包(Closure)功能。 多线程与并发:了解GCD(Grand Central Dispa
3. **块(Block)**:块是Objective-C中的一种闭包表达式,可以用来封装一段代码,并可以在需要的时候调用执行。块的应用非常广泛,特别是在异步操作和延迟执行等方面。 #### 八、Objective-C教程和资源网站 互联网...
6. **Block**:Objective-C引入了Block(块)的概念,这是一种内联函数,可以作为参数传递,也可以作为返回值。它们常用于异步编程和事件处理。 7. **自动引用计数(ARC)**:Objective-C的内存管理使用自动引用...
6. **块(Block)**:块是一种闭包,可以在代码中定义并存储一段可执行的代码。 ### 三、语法特点 1. **选择器(Selector)**:选择器是消息的名字,用于标识对象可以响应的方法。 2. **动态绑定(Dynamic ...
在iOS开发中,Objective-C是主要的编程语言之一,面试中常常会涉及到一系列技术问题,以下是一些关于Objective-C的面试知识点和解答: 1. **main.m中的过程**: `main.m`是iOS应用程序的入口点。在这个文件中,`...
- Block是Object-C中的匿名函数,可以作为参数传递,也可以存储在变量中,常用于异步操作的回调。 6. **KVC(Key-Value Coding)和KVO(Key-Value Observing)** - KVC允许通过字符串键来访问对象的属性,而KVO则...
3. **块(Block)**:块是Objective-C中的匿名函数,可以用来封装一段代码,类似于其他语言中的lambda表达式。 4. **属性**:属性用于定义类中实例变量的访问接口。 5. **类别(Category)**:类别可以在不修改原始类的...
7. **Block语法**:Objective-C支持块(Block),一种内联函数,常用于回调和并发操作。它们可以捕获并存储执行上下文中的局部变量,方便在异步操作中使用。 8. **Cocoa Touch**:Cocoa Touch是iOS应用开发的一部分...
Block是Objective-C中的闭包,允许在代码中定义匿名函数,并能捕获和存储上下文中的局部变量。这对于异步编程和事件处理非常有用。 7. **GCD(Grand Central Dispatch)** GCD是Apple提供的多线程解决方案,使用...
- **块(Block)支持**:块是一种匿名函数,类似于其他语言中的lambda表达式。它们可以用来编写更简洁的代码。 - **快速枚举**:这是一种用于遍历集合的新方式,简化了对数组和集合的处理。 - **属性(Attribute)声明**...
- **块(Block)**:类似于C#中的匿名方法或lambda表达式,块可以作为参数传递给方法。 通过本篇文章的学习,你已经掌握了Objective-C的一些基本概念和语法特性。接下来,可以通过实践项目来进一步巩固这些知识,并...
5. **Blocks与GCD**:Objective-C引入了Block(块)的概念,它是一种内联函数,常用于异步处理和并发编程。GCD(Grand Central Dispatch)是苹果的并发编程框架,使用Block来简化并发任务的管理。 6. **Foundation...
3. **块(Blocks)**:Objective-C引入了块(Block),这是一种局部函数的闭包,常用于异步操作和简化代码。 4. **属性(Properties)**:Objective-C提供了一种声明和管理对象属性的机制,包括自动内存管理、存取...