原文地址:http://blog.sina.com.cn/s/blog_67419c420100vl8b.html
<wbr>在ios4之后,引入了代码块的特性,在gcd中会经常的用到,所以决定好好的看看代码块文档,把这块总结一下。从头开始讲解代码块。 </wbr>
1.声明和使用代码块
一般用^操作符声明一个块变量,并作为块的开始符。而块的本身用{}包括起来,就像下面那样。
int multiplier = 7;
|
int (^myBlock)(int) = ^(int num) {
|
return num * multiplier;
|
};
|
下面的图是详细的讲解:

<wbr><wbr><wbr>其实意思就是前半句声明了一个名字为myBlock的代码块,有一个int类型的参数,并返回一个int类型的值;后面的半句就是一个块的定义,然后赋值给myBlock。</wbr></wbr></wbr>
<wbr><wbr><wbr>如果我们像上面那样,声明一个块像一个变量一样,我们就可以像使用函数一样使用它,如下:</wbr></wbr></wbr>
int multiplier = 7;
|
int (^myBlock)(int) = ^(int num) {
|
return num * multiplier;
|
};
|
|
printf("%d", myBlock(3));
|
// prints "21"
|
2.直接使用block
在大多数情况下,我们不需要去声明一个块变量,我们直接写一个简单的代码块作为参数传递就行。下面的代码函数qsort_b的第三个参数就是一个代码块。
char *myCharacters[3] = { "TomJohn", "George", "Charles Condomine" };
|
|
qsort_b(myCharacters, 3, sizeof(char *), ^(const void *l, const void *r) {
|
char *left = *(char **)l;
|
char *right = *(char **)r;
|
return strncmp(left, right, 1);
|
});
|
|
// myCharacters is now { "Charles Condomine", "George", "TomJohn" }
|
<wbr><wbr>一些cocoa frameworks的方法采用一个block作为一个参数,典型的是对一个集合对象进行操作,或者是在一个操作完成之后使用回调。下面的例子是NSArray类的方法<span style="font-family:Courier,Consolas,monospace; font-size:13px; color:#666666; line-height:normal"><a href="http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html#//apple_ref/occ/instm/NSArray/sortedArrayUsingComparator:" target="_self">sortedArrayUsingComparat<wbr>or:</wbr></a></span>怎样使用一个block。此方法使用一个block作为一个参数。</wbr></wbr>
NSArray *stringsArray = [NSArray arrayWithObjects:
|
@"string 1",
|
@"String 21",
|
@"string 12",
|
@"String 11",
|
@"String 02", nil];
|
|
static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |
|
NSWidthInsensitiveSearch<wbr> | NSForcedOrderingSearch;</wbr>
|
NSLocale *currentLocale = [NSLocale currentLocale];
|
|
NSComparator finderSortBlock = ^(id string1, id string2) {
|
|
NSRange string1Range = NSMakeRange(0, [string1 length]);
|
return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];
|
};
|
|
NSArray *finderSortArray = [stringsArraysortedArrayUsingComparat<wbr>or:finderSortBlock];</wbr>
|
NSLog(@"finderSortArray: %@", finderSortArray);
|
|
|
block的一个强大的功能是可以修改同一作用雨的变量,我们只需要在变量的前面加上一个_block标识符。下面的例子和上面的相同,只是添加功能用于记录相同元素的个数。
NSArray *stringsArray = [NSArray arrayWithObjects:
|
@"string 1",
|
@"String 21", // <-
|
@"string 12",
|
@"String 11",
|
@"Strîng 21", // <-
|
@"Striñg 21", // <-
|
@"String 02", nil];
|
|
NSLocale *currentLocale = [NSLocale currentLocale];
|
__block NSUInteger orderedSameCount = 0;
|
|
NSArray *diacriticInsensitiveSort<wbr>Array = [stringsArray sortedArrayUsingComparat<wbr>or:^(id string1, id string2) {</wbr></wbr>
|
|
NSRange string1Range = NSMakeRange(0, [string1 length]);
|
NSComparisonResult comparisonResult = [string1 compare:string2 options:NSDiacriticInsensitiveSe<wbr>arch range:string1Range locale:currentLocale];</wbr>
|
|
if (comparisonResult == NSOrderedSame) {
|
orderedSameCount++;
|
}
|
return comparisonResult;
|
}];
|
|
NSLog(@"diacriticInsensitiveSort<wbr>Array: %@", diacriticInsensitiveSort<wbr>Array);</wbr></wbr>
|
NSLog(@"orderedSameCount: %d", orderedSameCount);
|
|
|
3.block变量的声明
block的声明和函数指针差不多,只是把*改为了^
void (^blockReturningVoidWithVo<wbr>idArgument)(void);</wbr>
|
int (^blockReturningIntWithInt<wbr>AndCharArguments)(int, char);</wbr>
|
void (^arrayOfTenBlocksReturnin<wbr>gVoidWithIntArgument[10])(int);</wbr>
|
也可以使用typedef去声明block,方便以后使用,如下:
typedef float (^MyBlockType)(float, float);
|
|
MyBlockType myFirstBlock = // ... ;
|
MyBlockType mySecondBlock = // ... ;
|
4.变量的作用域对于其在块中的影响:
_block int x = 123; // x lives in block storage
|
|
void (^printXAndY)(int) = ^(int y) {
|
|
x = x + y;
|
printf("%d %d\n", x, y);
|
};
|
printXAndY(456); // prints: 579 456
|
// x is now 579
|
extern NSInteger CounterGlobal;
|
static NSInteger CounterStatic;
|
|
{
|
NSInteger localCounter = 42;
|
__block char localCharacter;
|
|
void (^aBlock)(void) = ^(void) {
|
++CounterGlobal;
|
++CounterStatic;
|
CounterGlobal = localCounter; // localCounter fixed at block creation
|
localCharacter = 'a'; // sets localCharacter in enclosing scope
|
};
|
|
++localCounter; // unseen by the block
|
localCharacter = 'b';
|
|
aBlock(); // execute the block
|
// localCharacter now 'a'
|
}
|
5.使用blocks
(1)调用一个声明好的block
int (^oneFrom)(int) = ^(int anInt) {
|
return anInt - 1;
|
};
|
|
printf("1 from 10 is %d", oneFrom(10));
|
// Prints "1 from 10 is 9"
|
|
float (^distanceTraveled) (float, float, float) =
|
^(float startingSpeed, float acceleration, float time) {
|
|
float distance = (startingSpeed * time) + (0.5 * acceleration * time * time);
|
return distance;
|
};
|
|
float howFar = distanceTraveled(0.0, 9.8, 1.0);
|
// howFar = 4.9
|
分享到:
相关推荐
### Objective-C 中代码块(Blocks)详解 #### 一、代码块的概念与基本用途 Objective-C 的代码块(Blocks)是一种强大的语言特性,允许开发者创建一段可以存储并稍后执行的代码片段。自 iOS 4 开始,Apple 在其...
5. **块(Blocks)**:Objective-C引入了块的概念,它是一种可以捕获和存储局部变量的匿名函数,常用于异步操作回调。 二、Objective-C语法 1. **实例变量(Instance Variables)**:使用`@property`和`@...
- **定义与使用**:Objective-C中的代码块是一种内联函数,可以作为参数传递、存储在变量中、返回给调用者。 - **捕获变量**:块可以捕获并使用定义时的局部变量,甚至可以修改这些变量(如果它们是可变的)。 4....
5. **块(Blocks)**: 块是Objective-C中的匿名函数,可以作为参数传递,也可以作为返回值。它们使得代码更加简洁和易读,常用于异步操作。 6. **Foundation框架**: 这是Objective-C的核心框架,提供了许多基础数据...
4. **Objective-C 2.0新特性**:第六版可能会涵盖Objective-C 2.0引入的一些新特性,如垃圾回收、属性(properties)和块(blocks)等,这些都是现代Objective-C编程不可或缺的部分。 5. **内存管理**:Objective-C...
此外,可能会对比两种语言的类系统,解释如何在Objective-C中使用C++代码,以及如何在C++项目中集成Objective-C。 通过阅读这三本书,读者将全面了解Objective-C的各个方面,从基础语法到高级特性和最佳实践。无论...
Objective-C还支持块(Blocks),这是一种内联函数,可以在代码中定义并传递。块允许在函数内部定义局部函数,通常用于异步操作的回调。 Foundation框架是Objective-C的标准库,提供了许多基础数据类型和常用功能,...
6. **块(Blocks)**:Objective-C支持内联函数或闭包,称为块。块可以作为参数传递,也可以作为返回值,增强了代码的可读性和效率。 7. **自动引用计数(ARC)**:Objective-C的内存管理采用自动引用计数,编译器...
- **Blocks(块)**:Objective-C引入了块的概念,类似于C++的lambda表达式,用于创建匿名函数。 - **GCD(Grand Central Dispatch)**:Apple的多线程解决方案,利用块实现并发编程。 - **KVC(Key-Value Coding...
7. 多线程和异步编程,Objective-C支持多线程编程,书中可能会介绍Blocks、Grand Central Dispatch(GCD)等并发编程的工具。 8. 设计模式,作者可能会讨论常见的设计模式以及它们在Objective-C编程中的应用。 9. ...
- 类(Classes)是 Objective-C 中的基本构建块,它们定义了对象的属性和行为。 - 对象(Objects)是类的实例,具有特定的属性和方法。 - 消息传递(Message Passing)是通过点语法(如 `object.method`)向对象...
3. **块(Blocks)**:Objective-C的块是一种内联函数,可以捕获并存储其定义时的作用域内的变量。它们在处理异步操作和回调时非常实用。 4. **懒加载(Lazy Loading)**:这是一种优化技术,延迟初始化直到真正...
在介绍完这些基础后,本书开始探讨Blocks(块)和并发编程,这对于利用Objective-C开发高性能的应用程序至关重要。 对于iOS开发者来说,UIKit和ApplicationKit是两个极为重要的框架。UIKit提供了iOS应用所需的界面...
6. **块(Blocks)**:Objective-C的块是内联函数,可以捕获并存储执行上下文,常用于异步操作和简化回调处理。 7. **GCD**:Grand Central Dispatch是Apple提供的多线程和并发处理工具,它简化了在多核处理器上...
它涵盖了代码块(Blocks)的使用,代码块是一种可以捕获其创建环境状态的匿名函数,能够方便地实现对代码的封装和复用。此外,还介绍了键值编码(Key-Value Coding,KVC)和键值观察(Key-Value Observing,KVO)...
- **Blocks**:介绍Objective-C中的Blocks机制,这是一种非常强大的匿名函数实现方式。 - **代理模式**:阐述代理模式在Objective-C中的应用,以及如何利用它实现对象间的通讯。 ##### 9. 编程实践 - 分享实际开发...
4. **块(Blocks)**:Objective-C的块是一种闭包,可以在代码中捕获局部变量。书中会讲解如何创建、使用和存储块,以及它们在异步编程和GCD(Grand Central Dispatch)中的应用。 5. **属性(Properties)**:...