ios-block-对象与对象之间的解偶合

对象与对象之间通信的3种方式
1.通知1对多
2.代理
3.block
//blcok中要引用局部变量的时候会作为一个常量编码到block中,因为block不是马上执行的,然而局部变量出来大括号就释放掉了,当然是可以用,不可以修改的
int number=20;
    [self test:^int(int a,int b){
        number=30;
        return a+b;
    }];
这种是错误的,
当然也可以用__block修饰
__block int number=20;
    [self test:^int(int a,int b){
        number=30;
        return a+b;
    }];
就可以修改了,经过多方测试,只是因为有了__block修饰过后这个局部变量出了大括号不会马上消失,//这个不会作为一个变量编码到block中

当在block里面操作对象的时候,引用计数会加1,因为block会将这个的指针copy一份,和java类似管理对象,一个引用就相当于一个引用计数,自然会加一,当有__block修饰的时候不会被编码到block中,是直接通过现有的指针进行操作。只是作用域(作用域会变成,原有作用域和block作用域中大得那个)不会出括号就消失罢了。

//是通过测试了得,简单一句就是,是否有被编码到block中(判断是否有被编码进去,前提是block中是否用到,再看是否有__block修饰),编码进去了就是复制了一份(简单数据类型就完全脱离的2份,对象就是多了一个引用,相当于retain),没有编码进去(只是会改变作用域),操作的还是原来的那个值或者对象。
//类似于,强引用和若引用,没有block的就是强引用,有block修饰的就是弱引用,又不完全是强弱引用的关系,弱引用是没法将作用域变化的,(对象的作用域无非还是引用计数的问题,说到底还是再该释放的时候没释放罢了)


 
1.这里只记录一些学习笔记 2.这里只记录一些学习心得,如果心得方向有错,请留言 2.这里只记录一些日记(只为提升英语,暂时有点忙,等转行了开始写)
原文地址:https://www.cnblogs.com/liyang31tg/p/3667123.html