关于block知识点总结

1:什么是block?

block其实就是一个代码块,把你想要执行的代码封装在这个代码块里,等到需要的时候再去调用。那block是OC对象吗?答案是肯定的.

2:block要用copy修饰,还是用strong

block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。
使用retain也可以,但是block的retain行为默认是用copy的行为实现的,

因为block变量默认是声明为栈变量的,为了能够在block的声明域外使用,所以要把block拷贝(copy)到堆,所以说为了block属性声明和实际的操作一致,最好声明为copy。

如果语法块仅仅是执行而不再回调回去了, 比如操作某个数据库,修改某个单利类的属性,发送某个通知之类的,则可以用weak来修饰。

有人会问:
为什么不能这里不都用copy呢,原因是 优化内存。  如果这个类要传入1000Block来执行,而这个类又不会马上释放掉的话,用copy是不是就拷贝了1000个在堆里面? 这样就会占用很大一部分内存,如果使用了weak将不必要的执行后就可以马上释放掉是不是就节约了很多的内存了。
 
3:__block有什么用?
 
__block在MRC中有两个作用.1,允许block中访问和修改局部变量.  2,防止block中对引用对象进行隐式retain操作引起引用计数+1从而造成的循环引用
__block在ARC中只有一个作用. 允许block中访问和修改局部变量

4:__block和__weak有什么区别?

__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,可以修饰基本数据类型.      __week只能在ARC模式下使用,只能修饰对象(NSString),不能修饰基本数据类型. __block可以在block中修改变量,而__week不可以.

 

如果对你有帮助请分享给身边有需要的朋友.

 

posted @ 2017-12-07 15:49  港吧休  阅读(403)  评论(0编辑  收藏  举报