首页 > ios > Blocks的编程应用笔记

Blocks的编程应用笔记

  Blocks 最大的便利就是在动画时简化的回调过程。 在cocos2d中用Blocks能使代码更简洁,用CCCallBlock,CCCallBlockN(可以传一个参数),加在动画的末尾,大大简化了回调的过程,使代码看着更加的整洁。
  在写个小Demo,以后复习的时候也能看看。功能是,在V2Controller中改变V1Controller的颜色,大概的核心代码:

V2Controller.h
typedef void (^greenColorT)(UIColor *color);
@interface V2Controller : UIViewController {
    greenColorT gc;
}
(void)setGreenColor:(greenColorT) newGc;
@end
V2Controller.m
- (void)setGreenColor:(greenColorT)newGc {
    
    [gc release];
    gc = [newGc copy];
}
(void)button2Click {
 gc([UIColor greenColor] );
}

  在声明的上一页中写到:

    [vc setGreenColor:^(UIColor *color) {
        self.view.backgroundColor = [UIColor greenColor];
    }];

  查询资料后的主要记载:
  Block 对象是 C 级别的语法和运行时特性。它们和标准 C 函数很类似,但是除了 可执行代码外,它们还可能包含了变量自动绑定(栈)或内存托管(堆)。 所以一个 block 维护一个状态集(数据),它们可以在执行的时候用来影响程序行为。
  你可以用 blocks 来编写函数表达式,这些表达式可以作为 API 使用,或可选的存 储,或被多个线程使用。Blocks 作为回调特别有用,因为 block 携带了进行回调所需 要的执行代码和执行过程中需要的数据。
  使用Blocks能让程序更高效和更易于维护。
  Blocks声明实例:int (^myBlock)(int) = ^int(int XX){func};
  Blocks 的最大一个特色就是可以修改相同作用域的变量。
  Block 对象提供了一个使用 C 语言和 C 派生语言(如 Objective-C 和 C++)来创建 表达式作为一个特别(ad hoc)的函数。在其他语言和环境中,一个block对象有时候 被成为“闭包(closure)”。
(网络查询:闭包:闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义。
  闭包的价值在于可以作为函数对象 或者匿名函数,对于类型系统而言这就意味着不仅要表示数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到变量中、作为参数传递给其他函数,最重要的是能够被函数动态地创建和返回。)

Block功能

一个 block 就是一个匿名的内联代码集合体:
  1.和函数一样拥有参数类型
  2.有推断和声明的返回类型
  3.可以捕获它的声明所在相同作用域的状态
  4.可以和其他定义在相同作用域范围的 blocks 进行共享更改
  5.在相同作用域范围(栈帧)被销毁后持续共享和更改相同作用域范围(栈帧)的状态

Block用处

  Blocks 通常代表一个很小、自包的代码片段。因此它们作为封装的工作单元在并 发执行,或在一个集合项上,或当其他操作完成时的回调的时候非常实用。
  Blocks 作为传统回调函数的一个实用的替代办法,有以下两个原因:
  1.它们可以让你在调用的地方编写代码实现后面将要执行的操作。因此 Blocks 通常作为框架方法的参数。
  2.它们允许你访问局部变量。而不是需要使用一个你想要执行操作时集成所有上下文的信息的数据结构来进行回调,你可以直接简单的访问局部变量。

  Blocks 被设计为类型安全的,它通过给编译器完整的元数据来合法使用 blocks、 传递到 blocks 的参数和分配的返回值。你可以把一个 block 引用强制转换为任意类型 的指针,反之亦然。但是你不能通过修饰符 * 来解引用一个 block,因此一个 block 的大小是无法在编译的时候计算的。
  当在多个地方使用同一个给定的签名的 block 时,typedef float (^MyBlockType)(float, float);通常被认为是最佳的办法。

  1. Romana 9月 2nd, 2012 @ 07:54 | #1

    Whoa, tihgns just got a whole lot easier.

评论提交中, 请稍候...

留言


可以使用的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks