本来想把标题命名为 【OC 中 Block 的本质】。
废话不多说,直接往下看。
有几句简单的代码,望君记下:
NSObject* obj;
printf("1 = %p\n", &obj);
void (^block)(void) = ^{
printf("2 = %p\n", &obj);
};
printf("3 = %p\n", &obj);
block();
printf("4 = %p\n", &obj);
接下来,为了简单方便,直接使用图片了。
场景一

除了红框框中的打印,其它的都一样。换句话说,在 block 中的 obj 的地址变了,同一个东西,地址尽然还变了,这是什么个情况???同时也要注意地址变化的位置,貌似相隔甚远呐。
场景二

是的、没有看错,相比于场景一,就多了一个 __block 修饰符。除了 block 定义之前的都变了,尤其是第3个,block 还没被执行呢,还跟着凑什么热闹,尽然也变了。同样,也看一下变化的地址。
场景三

是的、你依然没有看错,仅仅是变了一个修饰符 static。这一次就更加的厉害了,都没有变。但是,不要忘记了看看这一次的地址,与场景一、二的有什么不同。答案是长度不同,对的、可以这么回答。
说吧
看完了上面的三张图片,你就没有什么要跟我说的吗?好吧、不说的话,就直接看最后的总结吧。
总结

网友评论