-
在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
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