enumerateKeysAndObjectsUsingBlock:的使用

来源:互联网 发布:java 调用内部类 编辑:程序博客网 时间:2024/04/29 10:07
block是一个有序列的指令代码块,通常在代码中间花括号括起来的objective-c代码,但是它能被传递和被分配局部变量,然后作为一个参数来传递,基本上可以把花括号中间的代码保存到数据结构里。看起来就像这样子:
  
  1.  BOOL stoppedEarly = NO;double stopValue = 53.5;[aDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { NSLog(@“value for key %@ is %@”, key, value); if ([@“ENOUGH” isEqualToString:key] || ([value doubleValue] == stopValue)) { *stop = YES; stoppedEarly = YES; // ILLEGAL }}];
复制代码

  不过如果你在前面加上_block,就会变成可读写了,然后在block执行完后它会保留被赋的值。
  
  1.  typedef一个block:
  2.   unary_operation_t square;square = ^(double operand) { // the value of the square variable is a block return operand * operand;}
复制代码

  现在有了一个类型为unary_operation_t的变量square,怎么用呢?就像用一个C语言函数一样:
  
  1. double (^square)(double op) = ^(double op) { return op * op; };
复制代码

  此处的square是一个变量,而不是一个类型。

  一旦定义好unary_operation_t,这种类型实际上是一个block,就可以用它进行函数声明了,把它作为函数的参数,就是声明一个参数为unary_operation_t类型的方法,比如addUnaryOperation:whichExecutesBlock:,第二个参数是block,可以用unary_operation_t来声明这个方法。首先,加入一个property:
 
  1.  typedef double (^unary_operation_t)(double op);- (void)addUnaryOperation:(NSString *)op whichExecutesBlock:(unary_operation_t)opBlock { [self.unaryOperations setObject:opBlock forKey:op];}
复制代码

  这个方法的第二个参数是一个block,unary_operation_t指明了block的类型。把block看成一个对象,通过给定的key加入到dictionary里。block用起来像类一样,实际不是,只是有些相似,不能给它传递消息,可以像安置id一样安置它们。

  ARC负责block的内存管理,由于它本身并不是一个对象,它靠ARC进行内存管理,当block执行完之后,它的内存是自动释放的。

  然后我们就有了一个字典,字典的key是代表操作的字符串,值是block。接着可以这么做:
  
  1.  - (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, BOOL *stop))block;
复制代码

  没有返回值所以是void,注意(^),在括号中间没有其他东西,是因为没有定义type。后面就是block需要的参数,然后就是block。

  block很常见,实际上有简便方法,然后有两件事情需要去做:第一,不必去声明那些能被block里面引用的返回的type,如果它能够在block里被推断出来,比如
 
  1.  [UIView animateWithDuration:5.0 animations:^{ view.opacity = 0.5;}];
复制代码

  没有参数,没有返回值,仅仅是花括号。
0 0
原创粉丝点击