问:iOS 开发中经常会用strong和weak来修饰一些属性,这两个的区别又在哪?
就像图片中的这样,A和B都要引用C对象,可是A和C之间是实线(强引用),B和C之间是虚线(弱引用)。
不论B是否还在引用C(即不论虚线是否存在),只要当A还在引用C的时候,表明实线还在,那么C就会一直占用一块内存空间,不会被释放;
但是当A不再引用C,实线不存在了,就表明没有强指针再指向C了,这时候即使B还在引用C,虚线还存在,那么C也一样会被释放,不会在内存中再占有内存空间。
不论虚线是否存在,只要实线在,C就在,实线不在,C在内存中就不存在了。
(weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。
一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。
可能有个例子形容是妥当的。
想象我们的对象是一条狗,狗想要跑掉(被释放)。
strong型指针就像是栓住的狗。只要你用牵绳挂住狗,狗就不会跑掉。如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落 ,否着狗是不会跑掉的。
weak型指针就像是一个小孩指着狗喊到:“看!一只狗在那” 只要狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。只要狗的牵绳脱落,狗就会跑掉,不管有多少小孩在看着它。
只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。
_block & _weak:
在block代码块中也会用类似代码来修饰变量,例如:__weak typeof(self) wself = self;
__block 为了改变block代码块外部的变量。例如:你在外面定义了一个整形变量,想要在block块内改变他,那么,就要用__block 来修饰这个整形变量。
__weak 是为了防止循环引用,引起内存泄露的问题。
(http://blog.csdn.net/winzlee/article/details/45623905)