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++起源于C语言,强调面向对象编程,而Objective C则是在C的基础上扩展了面向对象特性,主要用于苹果的iOS和Mac OS X开发。从C++过渡到Objective C的学习之旅是一条富有挑战的道路,但同时也充满了机遇。以下是一些...
在这个名为"The Objective-C block utilities you always wish you had"的压缩包中,很显然,它包含了一些用于增强Objective-C中Block功能的实用工具。Blocks是Objective-C中的一个强大特性,它们允许程序员定义可...
Swift中的闭包和Objective-C中的Block是两种编程语言中实现匿名函数的关键特性,它们允许我们定义可以在不同上下文中使用的代码块。尽管这两种语言都属于Apple的生态系统,但它们在闭包和Block的概念上有细微差别。 ...
Objective-C是在C语言的基础上扩展了Smalltalk式的面向对象特性,使得它既有C语言的强大功能,又具备了面向对象编程的灵活性。 在Objective-C中,类是所有对象的基础。类定义了一组属性(实例变量)和方法(函数)...
书中还可能涵盖Block(代码块)的使用,这是Objective-C中一种强大的语法特性,常用于多线程和异步编程,因为它可以捕获和封装变量的上下文。另外,可能会讲解到Cocoa Touch和Cocoa框架中的线程安全类和方法,以及...
### Objective-C 中代码块(Blocks)详解 #### 一、代码块的概念与基本用途 Objective-C 的代码块(Blocks)是一种强大的语言特性,允许开发者创建一段可以存储并稍后执行的代码片段。自 iOS 4 开始,Apple 在其...
1. Objective-C语言简介:Objective-C是一种通用的编程语言,其被广泛应用于苹果公司的macOS、iOS、watchOS和tvOS操作系统。它基于C语言,并加入了Smalltalk风格的消息传递机制。 2. 类和消息机制:Objective-C语言...
3. **Block 语法改进**:Block 是 Objective-C 中一种重要的语言特性,用于定义一段可执行代码,第六版对此进行了优化,使其更加灵活高效。 4. **类型注解**:增强了静态类型检查,有助于早期发现潜在的问题。 5. **...
1. **Objective-C基础**:Objective-C是在C语言基础上扩展的,添加了面向对象特性。它的基础包括类、对象、消息传递等概念。类定义了对象的属性和行为,对象则是类的实例。消息传递是Objective-C的核心,通过`...
7. **Block和GCD**:Block是Objective-C中的匿名函数,可以用于简化回调和并发处理。Grand Central Dispatch(GCD)是Apple提供的多线程解决方案,书中可能讲解如何利用它们优化程序性能。 8. **Cocoa Touch和App...
首先,Objective-C是在C语言的基础上扩展的,因此,理解C语言的基本语法是学习Objective-C的前提。它引入了消息传递机制,这是Objective-C的关键特性,允许对象之间进行通信。消息传递类似于函数调用,但更加灵活,...
Objective-C是C语言的超集,它扩展了C语言,加入了面向对象的特性。面向对象编程(OOP)的核心概念包括类、对象、继承、封装和多态。Objective-C通过消息传递机制实现了这些概念,使得代码更加模块化和可维护。 2....
Block(块)是Objective-C的另一项重要特性,它是一种内联函数,可以捕获并存储其定义时的作用域内的变量。Block常用于异步操作的回调,如网络请求或GCD(Grand Central Dispatch)。 Foundation框架是Objective-C...
Objective-C起源于C语言,因此它保留了C的语法基础,同时增加了面向对象的特性。它的主要特点包括: 1. **动态类型**:Objective-C支持在运行时决定对象的类型,这使得代码更加灵活,但也可能导致一些类型错误难以...
Objective-C2.0是苹果公司开发的一种面向对象的编程语言,它是C语言的超集,融合了Smalltalk的动态特性,广泛应用于iOS和Mac OS X操作系统。本资料集中的"Objective-C2.0程序设计习题官方答案"显然是针对学习...
Objective-C是由C语言发展而来,融入了Smalltalk的面向对象特性,因此它结合了C的简洁性和面向对象的灵活性。 1. **面向对象编程基础**: Objective-C的核心是它的面向对象特性,包括类(Class)、对象(Object)...
Objective-C是C语言的一个超集,这意味着它包含了C语言的所有特性,并且添加了面向对象的特性。 Objective-C(通常缩写为Obj-C或OC)是一种通用的编程语言,它主要被用于苹果公司的操作系统,如macOS和iOS,以及它们...
尽管不是Objective-C 2.0的一部分,但这两个第三方库充分利用了Objective-C 2.0的Block特性,提供了更高级别的抽象和事件驱动编程模型,如BlocksKit增强Objective-C的方法调用,ReactiveCocoa则引入了响应式编程...