【转载】objective-c强引用与弱引用

形象比喻蛮好玩的^_^ 
 
__weak 和 __strong 会出如今声明中
 
默认状况下,一个指针都会使用 __strong 属性,代表这是一个强引用。这意味着,只要引用存在,对象就不能被销毁。这是一种所指望的行为:当全部(强)引用都去除时,对象才能被收集和释放。
 
不过,有时咱们却但愿禁用这种行为:一些集合类不该该增长其元素的引用,由于这会引发对象没法释放。在这种状况下,咱们须要使用弱引用(不用担忧,内置的集合类就是这么干的),使用 __weak 关键字。NSHashTable 就是一个例子。当被引用的对象消失时,弱引用会自动设置为 nil。Cocoa 的 Notification Center 就是这么一个例子,虽然这已经超出纯 Objective-C 的语言范畴 
 
 
本身更深理解:
1.(weak与strong)不一样的是:当一个对象再也不有strong类型的指针指向它的时候,它就会被释放,即便改对象还有_weak类型的指针指向它;
 
2.一旦最后一个指向该对象的strong类型的指针离开,这个对象将被释放,若是这个时候还有weak指针指向该对象,则会清除掉全部剩余的weak指针
 
 
类比为本身的思想:
     
  一个对象类比为一条狗,  释放对象 类比为 狗要跑掉
 
逻辑:
     strong类型的指针就像是栓住的狗,只要你用绳子拴住狗,那么狗就不会跑掉.
     类比 一个对象 new过之后,不会自动的释放
 
    若是有5我的都牵着这一条狗(5条绳子栓一只狗) 类比为 5个strong类型指针指向一个对象.
    除非5个绳子都脱落,不然狗是不会跑掉的,类比,5个strong指针都=nil,则该对象释放
 
   weak型指针就像是一个小孩子指着狗喊道:“看,有一只狗在那里”,只要狗一直被拴着,那么小孩子就能看到狗(weak指针)会一直指向它,
      
   只要狗的绳子脱落,那么狗就会跑掉,无论有多少的小孩在看着它。
 
   只要最后一个strong型指针再也不指向对象,那么对象就会被释放,同时全部的weak型指针都将会被清除。
 
在OC中strong就至关于retain属性,而weak至关于assign。只有一种状况你须要使用weak(默认是strong),就是为了不retain cycles(就是父类中含有子类{父类retain了子类},子类中又调用了父类{子类又retain了父类},这样都没法release)
 
原文:http://blog.sina.com.cn/s/blog_7c8dc2d50101lc08.html
相关文章
相关标签/搜索