本文不做Block的基本介绍和底层实现原理,有兴趣的同学直接戳这篇文章(http://www.jianshu.com/p/51d04b7639f1),写得灰常好,本文只在应用层面上带领读者进行思考,并整理出一些结论.这些结论是我从书上和上网资料收集所得,并通过实践进行验证而来,希望能和高手们共同探讨 :)
在看例子之前,至少要知道block有几个类型.
_NSConcreteGlobalBlock(全局块)
_NSConcreteStackBlock(栈块)
_NSConcreteMallocBlock(堆块)
废话不说,直接看例子.测试环境为ARC,就不做MRC的测试了.
精神病入门
例子一:
typedef void (^blk_t) ();
int main(int argc, const char * argv[]) {
blk_t block = ^{
printf("I'm just a block\n");
};
block();
return 0;
}
很简单的一段代码,执行block之后结果是I'm just a block.但如果问你,这个block是什么类型的block,你会怎么回答?
在代码中打一个断点,通过打印block的isa,可以知道该block是什么类型的.
第一步:打个断点
第二步:打印isa
然后就能看到结果了:
看到结果,尼玛居然是个全局块,可是我明明是在栈上创建的一个block呀!
再来看一个例子,这时定义了一个局部变量,并在block中使用了这个局部变量.
例子二:
typedef void (^blk_t) ();
int main(int argc, const char * argv[]) {
int i = 1;
blk_t block = ^{
printf("%d\n",i);
};
block();
return 0;
}
按照以上步骤再看看block的isa
……我去,怎么成堆块了?
别急,再举个