`

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则...

    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