Blocks和Grand Central Dispatch已经被iOS4支持,(Snow Leopard早就支持了).

程序运行架构

WWDC2010 Session206 介绍iPhone上的Blocks和Grand Central Dispatch (1)

Blocks

Blacks are available in C++ and Objective-C++.

Basic Blocks

我们在block中使用这个字符^ 因为这个字符很特别,在C++中不能作为操作符重载.

Block 词法

^ [返回类型][参数] { 内容 }

看起来就像一个没有名字的函数,前面加上^. 如果没有返回或者没有参数,可以把void省略。

WWDC2010 Session206 介绍iPhone上的Blocks和Grand Central Dispatch (1)

Blocks as Data

定义Block pointer. 看起来像函数pointer: void (*callable)(void);

void (^callable)(void);

下面这是一个复杂的block pointer,它的参数也是一个block pointer.

char *(^worker)(char *a, BOOL(^done)(int));

可以使用typedef来简化:

typedef BOOL (^doneBlk_t)(int);

char *(^workB)(char *a, doneBlk_t d);

Blocks实践

Work Block Consumer

定义一个repeat函数,参数一个block pointer:

typedef void (^workBlk_t)(int i);

void repeat(int n, workBlk_t aBlock) {

  for (int i = 0; i < n; ++i)

    aBlock(i);

}

定义一个 block然后调用repeat函数:

int d = 2;

workBlk_t w = ^(int i) {

  printf(“%d\n”, i * d);

};

repeat(5, w);

输出:

0

2

4

6

8

同步执行

[mySet objectsPassingTest: ^(id obj, BOOL *stop) {

  return [obj testValue: value];

}];

[aDictionary enumerateKeysAndObjectsUsingBlock: ^(id k, id v, BOOL *stop) {

  NSLog(@”%@ => %@”, k, v);

}];

Callbacks回调

有了block,我们可以直接定义callbacks,而不用去定义一个函数。这样会让代码简单点。

[application beginBackgroundTaskWithExpirationHandler: ^{

  /* expiration handler callback code */

}];

[anOperation setCompletionBlock: ^{

  /* handle operation completion */

}];

异步执行

[operationQueue addOperationWithBlock: ^{

  /* hard work is hard */

}];

dispatch_async(main_queue, ^{

  [viewController displayNewStuff];

}];

Lockless exclusion

// thread a

dispatch_async(queue, ^{ … });

// thread b

dispatch_async(queue, ^{ … });

// main thread

dispatch_async(queue, ^{ … });

Blocks详情

Block Object Details

1. Blocks(竟然)是Objective-C的一个对象

2. Block生成与栈上 (因为在栈上生成会很快)

- 可以用[aBlock copy] or Block_copy()复制到heap中 (相对代价大)

- 释放[aBlock release] or Block_release() (必须手动释放heap中的block)

3. Blocks have private const copy of stack (auto) variables

- Object references are retained.

4. Mutable variables must be declared with __block keyword

- Shared with all other blocks that use that variable

- Shared with the scope of declaration

- __block Object references are not retained

Block lifetime illustrated

1. Start on stack and capture state


WWDC2010 Session206 介绍iPhone上的Blocks和Grand Central Dispatch (1)

2. Copies state to heap
WWDC2010 Session206 介绍iPhone上的Blocks和Grand Central Dispatch (1)

3. block1 and block2/3 could finish first. No sequence.


相关文章:

  • 2021-12-18
  • 2022-02-26
  • 2022-12-23
  • 2021-11-04
  • 2022-01-17
  • 2022-12-23
猜你喜欢
  • 2021-08-26
  • 2022-12-23
  • 2021-05-02
  • 2022-12-23
相关资源
相似解决方案