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