iOS中强引用(strong)和弱引用(weak)的形象理解

自己在复习IOS相关东西时看到下面一段对引用类型的解读。笑死,不过确实很形象,头一次见这种解读方式。

1.(weak与strong)不同的是:当一个对象不再有strong类型的指针指向它的时候,它就会被释放,即使改对象还有_weak类型的指针指向它;

2.一旦最后一个指向该对象的strong类型的指针离开,这个对象将被释放,如果这个时候还有weak指针指向该对象,则会清除掉所有剩余的weak指针。

类比为自己的思想:  

  一个对象类比为一条狗,  释放对象 类比为 狗要跑掉

逻辑:

strong类型的指针就像是栓住的狗,只要你用 绳子拴住狗,那么狗就不会跑掉.

类比 一个对象 new过以后,不会自动的释放

如果有5个人都牵着这一条狗(5条绳子栓一只狗) 类比为 5个strong类型指针指向一个对象.

除非5个绳子都脱落,否则狗是不会跑掉的,类比,5个strong指针都=nil,则该对象释放

weak型指针就像是一个小孩子指着狗喊道:“看,有一只狗在那里”,只要狗一直被拴着,那么小孩子就能看到狗 (weak指针)会一直指向它,只要狗的绳子脱落,那么狗就会跑掉,不管有多少的小孩在看着它。

只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。所指向的对象销毁后,weak型指针会自动变成nil指针(空指针),不再指向已经销毁的对象

在OC中strong就相当于retain属性,而weak相当于assign。只有一种情况你需要使用weak(默认是strong),就是为了避免retain cycles(就是父类中含有子类{父类retain了子类},子类中又调用了父类{子类又retain了父类},这样都无法release)

原文链接:http://blog.sina.com.cn/s/blog_7c8dc2d50101lc08.htm

【assign和retain的区别】 

(1)接触过C,那么假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此时a和b指向同一块内存,请问当a不再需要这块内存,能否直接释放它?答案是否定的。因为a并不知道b是否还在使用这块内存,如果a释放了,那么b在使用这块内存的时候会引起程序crash掉。 

(2)知道了上述assign的问题,那么如何解决呢?最简单的一个方法就是使用引用计数。我们给那块内存设一个引用计数,当内存被分配并且赋值给a时,引用计数是1。当把a赋值给b时,引用计数增加到2.这时如果a不再使用这块内存,他只需要引用计数减1,表明自己不再拥有这块内存。b不再使用这块内存时也把引用计数-1.当引用计数变为0的时候,代表该内存不再被任何指针所引用,系统可以把它直接释放掉。 

小结:assign就是直接赋值,从而可能引起1中的问题,当数据为int,float等原生类型时,可以使用assign。retain使用了引用计数,retain引起引用计数+1,release引起引用计数-1.当引用计数为0时,dealloc函数被调用,内存被回收。 

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部