block实战讲解(1)

  1. 在OC里面,下面的两份代码有何区别?

    代码1

    dispatch_async(queue, ^{
        doSomethingWithObject(instanceVariable);
    });
    

代码2

    id localVariable = instanceVariable;
    dispatch_async(queue, ^{
        doSomethingWithObject(localVariable);
    });

解析:

    代码1会导致`block`强引用`self`,`block`销毁时才会释放对`self`的引用。
    代码2会导致`block`强引用`localVariable`,`block`销毁时才会释放对`localVariable`的引用,不会对`self`强引用。
  1. 下面两份代码分别打印什么?

    代码1

      void (^blockArray[3])(void);
    
      for ( int i = 0; i < 3; ++i) {
        blockArray[i] = ^{ printf("hello, %d\n", i+3); };
      }
    
      blockArray[0]();
    
      blockArray[1]();
    
      blockArray[2]();
    

    代码2

      void (^blockArrayWithBock[3])(void);
    
      for (__block int i = 0; i < 3; ++i) {
        blockArrayWithBock[i] = ^{ printf("hello, %d\n", i+3); };
      }
    
      blockArrayWithBock[0]();
    
      blockArrayWithBock[1]();
    
      blockArrayWithBock[2]();
    解析:
    

    代码1,因为i没有修饰符,所以,i的值会在block创建时,被block当做const处理。++i后,block内部的i值不会发生变化
    hello, 3
    hello, 4
    hello, 5

    代码2,因为i__block修饰符,所以,i的值会在语法作用域和block内共享。++后,block内部的i值也随之改变。

    hello, 6
    hello, 6
    hello, 6

你可能感兴趣的:(block实战讲解(1))