您的位置:首页 > 其它

block知识总结

2016-03-21 14:32 253 查看
一.block在内存中存在的形式

1.当把block句法写在函数或者方法外面时,系统会在静态数据区分配一块内存区域给block对象。这片区域在程序执行期会一直存在。

2.当block句法写在函数或者方法内部时,block对象被分配在栈上。

3.当对block执行copy操作时,如果block在栈上,则复制到堆上,如果block本来已经在堆上,则不进行复制而直接返回堆上的对象增加该对象的引用计。

二.block内基本变量(非对象)的行为

block可以访问它所在函数体内该函数的变量,但是对于不同的变量类型,这些变量有不同的行为。

1.对于全局变量,block可直接访问和修改全局变量的值,因为当block访问它们时传递的是它们的指针。

2.对于static修饰的局部变量,block可直接访问和修改变量的值,同样是因为当block访问它时传递的是它的指针。

3.除以上两种外的局部变量(栈内变量),block只可访问值而不能修改,因为这种情况下是值传递,无法对原值进行修改。

4.如果想在block内修改函数的局部变量,要在变量前加__block修饰符,当block访问带有__block修饰的局部变量时,传递的是该变量的地址。

三.block内使用对象时的行为

1.方法内的block可以直接访问实例变量,也可以改变其值。

2.方法内的block中存在实例变量时,如果在栈上生成block的副本,retain就会被发送给self而非实例变量,引用计数器的值也会加1。实例变量的类型不一定非得是对象。

3.block句法内存在非实例变量对象是,如果在栈上生成某个对象的副本,包含的对象就会接收到retain,引用计数器的值也会增加。

4.已经复制后,堆区域中某个block即使受到copy方法,结果也只是block自身的引用计数器加1。包含的对象的引用计数器的值不变。

5.复制的块对象在被释放时,也会向包含的对象发送release。

四.ARC和非ARC下block的操作的区别

待续

五.使用block注意事项

待续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: