`

Objective C Block

    博客分类:
  • ios
阅读更多

 

       Apple在C, Objective-C,C++加上Block這個延申用法。目前只有Mac 10.6 和iOS 4有支援。Block是由一堆可执行的程式组成,也可以称做沒有名字的Function (Anonymous function)。如果是Mac 10.6 或 iOS 4.0 之前的平台可以利用 http://code.google.com/p/plblocks/ 这個project得以支援Block语法。

   Apple有一个叫做GCD(Grand Central Dispach)的新功能,用在同步处理(concurrency)的环境下有更好的效率,是苹果为多核多线程编程出现的解决方案。Block语法产生的动机就是來自于GCD,用Block包好一个工作量交给GCD,GCD有一个宏观的视野可以来分配CPU,GPU,Memory。

    Block的实际行为和Function很像,最大的差别是在可以存取同一个Scope的变量值。Block实体形式如下:

       ^(传入参数列){行为主体};

     Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成: ^(void)。

       简单例子:

      

    ^(int a){return a*a;};
  
    int result = ^(int a){return a*a;}(5);
    NSLog(@"%d", result);
    上面的方法往往太复杂,很多时候我们使用一个Block Pointer的东西来简化用法。

 

 

    

    Block Pointer是这样定义的:

     回传值(^名字)(参数列);

       

    //声明一个square的Block Pointer,其所指向的Block有一个int输入和int输出
    int (^square)(int);
    //将Block实体指定给square
    square = ^(int a){ return a*a ; };
    //调用方法,感觉是是不是很像function的用法?
    int result = square(5);
    NSLog(@"%d", result);
   
    void myFunction(int (^mySquare)(int));     //function的定义,将Block作为参数
    int (^mySquare)(int) = ^(int a){return a*a;};   //定义一个mySquare的Block pointer变量
    myFunction(mySquare);    //把mySquare作为myFunction的参数
     Block需要注意的知识点

 

 1、可以读取和Block pointer同一个Scope的变量值:

 

    {
        int outA = 8;
        int (^myPtr)(int) = ^(int a){ return outA + a;};
        //block里面可以读取同一类型的outA的值
        int result = myPtr(3);  // result is 11
        NSLog(@"result=%d", result);
    }
 2.Block块体里用的scope定义的变量

 

    对于基本类型,这里copy的值是变量的值,不会变。如果它是一个记忆体的位置(地址),换句话说,就是这个变量是个指针的话,它的值是可以在block里被改变的。

 

 3.读取static变量的值

 

    {
        static int outA = 8;
        int (^myPtr)(int) = ^(int a){return outA + a;};
        outA = 5;
        int result = myPtr(3);  //result的值是8,因为outA是static类型的变量
        NSLog(@"result=%d", result);
        
    }

  4、Block Variable类型的变量

   在某个变量前面如果加上修饰字“__block”的话(注意,block前面有两个下划线),这个变量就称作block variable。

  那么在block里面就可以任意修改此变量的值,如下代码:

    

    {
        __block int num = 5;
        
        int (^myPtr)(int) = ^(int a){return num++;};
        int (^myPtr2)(int) = ^(int a){return num++;};
        int result = myPtr(0);   //result的值为5,num的值为6
        result = myPtr2(0);      //result的值为6,num的值为7
        NSLog(@"result=%d", result);  
    
    }

   

   可以通过通过typedef定义一个区块

  

typedef void (^SVHTTPRequestCompletionHandler)(id response, NSHTTPURLResponse *urlResponse, NSError *error);

    可以执行区块

    if(block){

       block(response,urlResponse,error);

    }

 

 

 

 

 

分享到:
评论

相关推荐

    从C++到Objective C的学习之路

    C++起源于C语言,强调面向对象编程,而Objective C则是在C的基础上扩展了面向对象特性,主要用于苹果的iOS和Mac OS X开发。从C++过渡到Objective C的学习之旅是一条富有挑战的道路,但同时也充满了机遇。以下是一些...

    The Objective-C block utilities you always wish you had..zip

    在这个名为"The Objective-C block utilities you always wish you had"的压缩包中,很显然,它包含了一些用于增强Objective-C中Block功能的实用工具。Blocks是Objective-C中的一个强大特性,它们允许程序员定义可...

    Swift 中的闭包和 Objective-C 中的Block

    Swift中的闭包和Objective-C中的Block是两种编程语言中实现匿名函数的关键特性,它们允许我们定义可以在不同上下文中使用的代码块。尽管这两种语言都属于Apple的生态系统,但它们在闭包和Block的概念上有细微差别。 ...

    Objective-C

    Objective-C是在C语言的基础上扩展了Smalltalk式的面向对象特性,使得它既有C语言的强大功能,又具备了面向对象编程的灵活性。 在Objective-C中,类是所有对象的基础。类定义了一组属性(实例变量)和方法(函数)...

    Objective-C高级编程 iOS与OS X多线程和内存管理_Objective-C_ios_

    书中还可能涵盖Block(代码块)的使用,这是Objective-C中一种强大的语法特性,常用于多线程和异步编程,因为它可以捕获和封装变量的上下文。另外,可能会讲解到Cocoa Touch和Cocoa框架中的线程安全类和方法,以及...

    objective-c 中代码块(blocks)详解

    ### Objective-C 中代码块(Blocks)详解 #### 一、代码块的概念与基本用途 Objective-C 的代码块(Blocks)是一种强大的语言特性,允许开发者创建一段可以存储并稍后执行的代码片段。自 iOS 4 开始,Apple 在其...

    Effective Objective-C 2.0

    1. Objective-C语言简介:Objective-C是一种通用的编程语言,其被广泛应用于苹果公司的macOS、iOS、watchOS和tvOS操作系统。它基于C语言,并加入了Smalltalk风格的消息传递机制。 2. 类和消息机制:Objective-C语言...

    Objective C 第六版

    3. **Block 语法改进**:Block 是 Objective-C 中一种重要的语言特性,用于定义一段可执行代码,第六版对此进行了优化,使其更加灵活高效。 4. **类型注解**:增强了静态类型检查,有助于早期发现潜在的问题。 5. **...

    Objective-C2.0程序设计第二版中文版及代码

    1. **Objective-C基础**:Objective-C是在C语言基础上扩展的,添加了面向对象特性。它的基础包括类、对象、消息传递等概念。类定义了对象的属性和行为,对象则是类的实例。消息传递是Objective-C的核心,通过`...

    objective-c编程 第2版=objective-c program 2nd edition_13889311

    7. **Block和GCD**:Block是Objective-C中的匿名函数,可以用于简化回调和并发处理。Grand Central Dispatch(GCD)是Apple提供的多线程解决方案,书中可能讲解如何利用它们优化程序性能。 8. **Cocoa Touch和App...

    objective-c基础教程(附源代码)

    首先,Objective-C是在C语言的基础上扩展的,因此,理解C语言的基本语法是学习Objective-C的前提。它引入了消息传递机制,这是Objective-C的关键特性,允许对象之间进行通信。消息传递类似于函数调用,但更加灵活,...

    Objective-C基础教程(Learn Objective-C)随书源码下载

    Objective-C是C语言的超集,它扩展了C语言,加入了面向对象的特性。面向对象编程(OOP)的核心概念包括类、对象、继承、封装和多态。Objective-C通过消息传递机制实现了这些概念,使得代码更加模块化和可维护。 2....

    Objective-C高级编程†

    Block(块)是Objective-C的另一项重要特性,它是一种内联函数,可以捕获并存储其定义时的作用域内的变量。Block常用于异步操作的回调,如网络请求或GCD(Grand Central Dispatch)。 Foundation框架是Objective-C...

    objective-c pdf document

    Objective-C起源于C语言,因此它保留了C的语法基础,同时增加了面向对象的特性。它的主要特点包括: 1. **动态类型**:Objective-C支持在运行时决定对象的类型,这使得代码更加灵活,但也可能导致一些类型错误难以...

    Objective-C2.0程序设计习题官方答案

    Objective-C2.0是苹果公司开发的一种面向对象的编程语言,它是C语言的超集,融合了Smalltalk的动态特性,广泛应用于iOS和Mac OS X操作系统。本资料集中的"Objective-C2.0程序设计习题官方答案"显然是针对学习...

    objective-c 编程

    Objective-C是由C语言发展而来,融入了Smalltalk的面向对象特性,因此它结合了C的简洁性和面向对象的灵活性。 1. **面向对象编程基础**: Objective-C的核心是它的面向对象特性,包括类(Class)、对象(Object)...

    探索Objective-C中的Block:强大灵活的代码块

    Objective-C是C语言的一个超集,这意味着它包含了C语言的所有特性,并且添加了面向对象的特性。 Objective-C(通常缩写为Obj-C或OC)是一种通用的编程语言,它主要被用于苹果公司的操作系统,如macOS和iOS,以及它们...

    Objective-C programming language 2.0

    尽管不是Objective-C 2.0的一部分,但这两个第三方库充分利用了Objective-C 2.0的Block特性,提供了更高级别的抽象和事件驱动编程模型,如BlocksKit增强Objective-C的方法调用,ReactiveCocoa则引入了响应式编程...

Global site tag (gtag.js) - Google Analytics