天天看點

retain、strong、weak、assign差別

在網上看到一個解釋weak和strong的例子,感覺挺形象的,如下:
一、weak和strong的差別
  (weak和strong)不同的是 當一個對象不再有strong類型的指針指向它的時候 它會被釋放  ,即使還有weak型指針指向它。
  一旦最後一個strong型指針離去 ,這個對象将被釋放,所有剩餘的weak型指針都将被清除。
  可能有個例子形容是妥當的。
  想象我們的對象是一條狗,狗想要跑掉(被釋放)。
  strong型指針就像是栓住的狗。隻要你用牽繩挂住狗,狗就不會跑掉。如果有5個人牽着一條狗(5個strong型指針指向1個對象),除非5個牽繩都脫落 ,否着狗是不會跑掉的。
  weak型指針就像是一個小孩指着狗喊到:“看!一隻狗在那” 隻要狗一直被栓着,小孩就能看到狗,(weak指針)會一直指向它。隻要狗的牽繩脫落,狗就會跑掉,不管有多少小孩在看着它。
  隻要最後一個strong型指針不再指向對象,那麼對象就會被釋放,同時所有的weak型指針都将會被清除。

二、weak和assign的差別
1、assign是指針指派,不對引用計數操作,使用之後如果沒有置為nil,可能就會産生野指針;而weak一旦不進行使用後,永遠不會使用了,就不會産生野指針!

三、
alloc 對象配置設定後引用計數為1
retain 對象的引用計數+1
copy copy 一個對象變成新的對象(新記憶體位址) 引用計數為1 原來對象計數不變

release 對象引用計數-1 如果為0釋放記憶體
autorelease 對象引用計數-1 如果為0不馬上釋放,最近一個個pool時釋放


四、

  
   
    1.假設你用malloc配置設定了一塊記憶體,并且把它的位址指派給了指針a,後來你希望指針b也共享這塊記憶體,于是你又把a指派給(assign)了b。此時a和b指向同一塊記憶體,請問當a不再需要這塊記憶體,能否直接釋放它?答案是否定的,因為a并不知道b是否還在使用這塊記憶體,如果a釋放了,那麼b在使用這塊記憶體的時候會引起程式crash掉。
   
   

   
   
    2.了解到1中assign的問題,那麼如何解決?最簡單的一個方法就是使用引用計數(referencecounting),還是上面的那個例子,我們給那塊記憶體設一個引用計數,當記憶體被配置設定并且指派給a時,引用計數是1。當把a指派給b時引用計數增加到2。這時如果a不再使用這塊記憶體,它隻需要把引用計數減1,表明自己不再擁有這塊記憶體。b不再使用這塊記憶體時也把引用計數減1。當引用計數變為0的時候,代表該記憶體不再被任何指針所引用,系統可以把它直接釋放掉。
   
   

   
   
    3.上面兩點其實就是assign和retain的差別,assign就是直接指派,進而可能引起1中的問題,當資料為int,float等原生類型時,可以使用assign。retain就如2中所述,使用了引用計數,retain引起引用計數加1,release引起引用計數減1,當引用計數為0時,dealloc函數被調用,記憶體被回收。
   
   
     
    
   
   
    4.copy是在你不希望a和b共享一塊記憶體時會使用到。a和b各自有自己的記憶體。
   
  
  

  
  

  
五、
1.assign: 用于非指針變量。用于基礎資料類型 (例如NSInteger)和C資料類型(int, float, double, char)另外還有id
  
         
   反正記住:前面不需要加 “*” 的就用assign吧,weak
    就是相當于
   assign
  
  
   

  
  
   2.
    retian :
   釋放舊的對象,将舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1,
   用于指針變量。就是說你定義了一個變量,然後這個變量在程式的運作過程中會被更改,并且影響到其他方法。
   xcode4.3及以後版本上面開發,retian和strong都是一樣的,沒差別
  
  
   

  
  
   3. 
   copy : 
   效果其實和retain沒什麼兩樣,唯一的差別就是copy隻用于NSString而不能用于
   NSMutableString,如果
   當一個類繼承NSObject,那麼這個類裡面的屬性需要使用copy。
  
  
   

  
  
   retain是指針拷貝,copy是内容拷貝。
六、

   
 strong 和weak

   
iOS 5 中對屬性的設定新增了strong 和weak關鍵字來修飾屬性(iOS 5之前不支援ARC)

   
strong 用來修飾強引用的屬性;

   
@property (strong) SomeClass * aObject;
對應原來的
@property (retain) SomeClass * aObject; 和 @property (copy)SomeClass * aObject;

weak 用來修飾弱引用的屬性;
@property (weak) SomeClass * aObject;
對應原來的
@property (assign) SomeClass * aObject;