iOS精选博文iOS面试知识点总结iOS Foundations

block实战讲解(2)

2016-04-04  本文已影响766人  酷酷的哀殿

在ARC环境下,下面的代码的执行结果是什么?

-(NSArray*) getBlockArray
{
  int num = 916;
  return [NSArray arrayWithObjects:
          ^{ NSLog(@"this is block 0:%i", num); },
          ^{ NSLog(@"this is block 1:%i", num); },
          ^{ NSLog(@"this is block 2:%i", num); },
          nil];
}

- (void) forTest
{
  int a = 10;
  int b = 20;
}

- (void)test
{
  NSArray*  blockArr = [self getBlockArray];
  [self forTest];

  void (^blockObject)(void);
  for(blockObject in blockArr){
    blockObject();
  }

答:

输出  this is block 0:916  后闪退

解析:

arrayWithObjects  方法只会copy第0个block,导致该block的类型修改为**NSMallocBlock**,后面的block被保持初始类型  NSStackBlock  并会在后续被系统回收内存。后面的for循环调用该指针时,会因为野指针而crash。
上一篇下一篇

猜你喜欢

热点阅读