`

Object-C中的块(Block)

 
阅读更多
在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();//仍然返回上一次的时间

分享到:
评论

相关推荐

    Object-C期末复习_object-c_

    - **类**:Objective-C中的基本构建块,定义了对象的属性(ivar)和方法(method)。 - **对象**:类的实例,具有特定的属性和行为。 2. **消息传递**: - Objective-C使用消息传递机制来调用对象的方法。当你写...

    Object-C demos

    5. **Block(块)**:Objective-C 支持块,这是一种可以捕获和存储执行上下文的匿名函数。在 "ObjCTest" 中,我们可能会看到使用 Block 进行异步处理或者作为回调的例子。 6. **内存管理**:Objective-C 早期采用的...

    Object-C语言,用C语言实现面向对象

    4. **块(Block)**:Objective-C支持内联函数,即可以像变量一样被赋值、传递和存储的匿名函数,增强了代码的灵活性。 5. **动态类型(Dynamic Typing)**:Objective-C是动态类型的,意味着在编译时并不完全确定...

    Object-C-Object-C编程规范.zip

    7. **块(Block)**:Objective-C支持块语法,用于定义匿名函数,常用于异步操作和回调。确保正确处理块的内存管理。 8. **异常处理**:Objective-C使用`@try`、`@catch`、`@finally`进行异常处理,但应谨慎使用,...

    Object-C的学习资料及14个Demo

    在Object-C中,你需要了解的关键概念还包括分类(Category)、协议(Protocol)和块(Block)。分类可以为已存在的类添加新的方法,而无需修改原始源代码。协议定义了一组可选的方法,类可以遵循协议以实现特定的...

    Object-C 学习笔记

    3. **块(Block)**:块是Object-C中的闭包,可以捕获并存储其所在上下文的局部变量,常用于异步处理。 4. **分类(Category)**:通过`@interface className (categoryName)`声明分类,添加方法到已存在的类。 5....

    Object-C语言教程&案例,要点难点,代码示例,代码解析

    Objective-C教程要点 基础语法:熟悉C语言基础是前提,Objective-C是在C语言的基础上增加了面向对象特性。...块与闭包:学习如何使用块(Block)实现闭包(Closure)功能。 多线程与并发:了解GCD(Grand Central Dispa

    Object-C语言教程&案例&相关项目资源分享.docx

    3. **块(Block)**:块是Objective-C中的一种闭包表达式,可以用来封装一段代码,并可以在需要的时候调用执行。块的应用非常广泛,特别是在异步操作和延迟执行等方面。 #### 八、Objective-C教程和资源网站 互联网...

    练习的工程Object-c-Excerise-master.zip

    6. **Block**:Objective-C引入了Block(块)的概念,这是一种内联函数,可以作为参数传递,也可以作为返回值。它们常用于异步编程和事件处理。 7. **自动引用计数(ARC)**:Objective-C的内存管理使用自动引用...

    object-c基础教程

    6. **块(Block)**:块是一种闭包,可以在代码中定义并存储一段可执行的代码。 ### 三、语法特点 1. **选择器(Selector)**:选择器是消息的名字,用于标识对象可以响应的方法。 2. **动态绑定(Dynamic ...

    ios object-c 面试试题 及答案

    在iOS开发中,Objective-C是主要的编程语言之一,面试中常常会涉及到一系列技术问题,以下是一些关于Objective-C的面试知识点和解答: 1. **main.m中的过程**: `main.m`是iOS应用程序的入口点。在这个文件中,`...

    object-C语法与编程技巧

    - Block是Object-C中的匿名函数,可以作为参数传递,也可以存储在变量中,常用于异步操作的回调。 6. **KVC(Key-Value Coding)和KVO(Key-Value Observing)** - KVC允许通过字符串键来访问对象的属性,而KVO则...

    From C++ To Object-C(中文版

    - **块(Block)**: 块是Objective-C中的一个功能强大的特性,它允许开发者定义一段可执行代码并将其传递给其他函数或存储起来供以后使用。块类似于C++中的lambda表达式。 - **快速枚举(Fast Enumeration)**: 快速...

    object-c 编程语言

    3. **块(Block)**:块是Objective-C中的匿名函数,可以用来封装一段代码,类似于其他语言中的lambda表达式。 4. **属性**:属性用于定义类中实例变量的访问接口。 5. **类别(Category)**:类别可以在不修改原始类的...

    使用Object-c开发的小项目

    7. **Block语法**:Objective-C支持块(Block),一种内联函数,常用于回调和并发操作。它们可以捕获并存储执行上下文中的局部变量,方便在异步操作中使用。 8. **Cocoa Touch**:Cocoa Touch是iOS应用开发的一部分...

    Object-C基础教程_高清扫描_带可跳转详细目录_apk版

    Block是Objective-C中的闭包,允许在代码中定义匿名函数,并能捕获和存储上下文中的局部变量。这对于异步编程和事件处理非常有用。 7. **GCD(Grand Central Dispatch)** GCD是Apple提供的多线程解决方案,使用...

    object-c 英文版

    - **块(Block)支持**:块是一种匿名函数,类似于其他语言中的lambda表达式。它们可以用来编写更简洁的代码。 - **快速枚举**:这是一种用于遍历集合的新方式,简化了对数组和集合的处理。 - **属性(Attribute)声明**...

    由C#转Object-C开发入门基础

    - **块(Block)**:类似于C#中的匿名方法或lambda表达式,块可以作为参数传递给方法。 通过本篇文章的学习,你已经掌握了Objective-C的一些基本概念和语法特性。接下来,可以通过实践项目来进一步巩固这些知识,并...

    Object-C资源.zip

    5. **Blocks与GCD**:Objective-C引入了Block(块)的概念,它是一种内联函数,常用于异步处理和并发编程。GCD(Grand Central Dispatch)是苹果的并发编程框架,使用Block来简化并发任务的管理。 6. **Foundation...

    毕业设计-Object-C

    3. **块(Blocks)**:Objective-C引入了块(Block),这是一种局部函数的闭包,常用于异步操作和简化代码。 4. **属性(Properties)**:Objective-C提供了一种声明和管理对象属性的机制,包括自动内存管理、存取...

Global site tag (gtag.js) - Google Analytics