Publicité

Block introduce

bang590
6 Jul 2012
Publicité

Contenu connexe

Publicité

Block introduce

  1. Block特性 bangchen
  2. block在栈创建
  3. block copy • 我们用到的callback/GCD都是copy • 第一次copy,block放入堆里 • 用到的值变量 制一份 • 引用到的所有对象reatainCount+1
  4. typedef int(^Blocky)(void); Blocky b[3]; for (int i=0; i<3; i++) b[i] = ^{ return i;}; for (int i=0; i<3; i++) printf("b %dn", b[i]());
  5. __block
  6. 把变量放入堆,指向同一个地址 typedef void(^Blocky)(void); Blocky b; int i = 0; b = ^{ NSLog(@"i %d", i); }; i ++; b(); //0 typedef void(^Blocky)(void); Blocky b; __block int i = 0; b = ^{ NSLog(@"i %d", i); }; i ++; b(); //1
  7. 可修改 id x; __block id y; __block BOOL isRuned = NO; void (^block)(void) =^{ x = [NSString string]; // error y = [NSString string]; // works isRuned = YES; //works };
  8. 递归调用block typedef int(^Blocky)(int i); __block Blocky b = ^(int i){ if (i == 0 || i == 1) return i; return b(i-1) + b(i-2); }; NSLog(@"%d", b(10));
  9. 循环引用
  10. 问题 [self setCompletionBlock:^{ NSLog(@"%@", self.error); }]; self retainCount + 1 self keep completeBlock - (void)setCompletionBlock:(ASIBasicBlock)aCompletionBlock { ! [completionBlock release]; ! completionBlock = [aCompletionBlock copy]; } self retain completionBlock, complationBlock retain self
  11. 解决(without ARC) __block id that = self; [self setCompletionBlock:^{ NSLog(@"%@", that.error); }]; or NSString *err = self.error; [self setCompletionBlock:^{ NSLog(@"%@", err); }];
  12. 解决(with ARC) iOS5: __weak id that = self; [self setCompletionBlock:^{ NSLog(@"%@", that.error); }]; iOS4/5: __unsafe_unretained id that = self; [self setCompletionBlock:^{ NSLog(@"%@", that.error); }];
  13. 不易发现的循环引用 ViewController* settingsViewController = [[[ViewController alloc] init] autorelease]; settingsViewController.onUpdate = ^{ [self doUpdate]; } self.settingsViewController = settingsViewController;
  14. END

Notes de l'éditeur

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
Publicité