1. 程式人生 > >強引用和弱引用(__strong和__weak)

強引用和弱引用(__strong和__weak)

初學者乾貨奮鬥

在OC ARC模式下開發:

id objcA =[ [NSObject alloc] init];

預設宣告的一個物件就為__strong強引用,等價於:

id __strong objcA =[ [NSObject alloc] init];

注:在強引用中,有時會出現迴圈引用的情況,這時就需要弱引用(__weak)來幫忙 ,如本部落格裡面提到的block的迴圈引用(retain cycle)

* 強引用弱引用的區別?

  1、強引用持有物件,弱引用不持有物件。

  2、強引用可以釋放物件,但弱引用不可以,因為弱引用不持有物件,當弱引用指向一個強引用所持有的物件時,當強引用將物件釋放掉後,弱引用會自動的被賦值為nil,即弱

        引 用會自動的指向nil。

程式碼示例:

int main(int argc, const char * argv[]) { @autoreleasepool { id __weak objA = nil; if (YES) { id objB = [[NSObject alloc] init]; objA = objB; NSLog(@"objA: %@", objA); } NSLog(@"objA: %@", objA); } return 0; }

輸出結果:

   objA: <NSObject: 0x1003066c0>

 objA: (null)

分析:
    因為objB生成的預設的為強引用(__strong),在超出if的作用域之後,objB所持有的物件被釋放,    objA為弱引用,所以objA不持有物件,在objB物件釋放後,objA自動的被賦值為nil     弱引用的特性是,不持有物件,即便是寫成id __weak objB = [[NSObject alloc] init];     此程式碼系統會給與警告,因為這裡objB被宣告成弱引用,那麼在賦值之後,alloc出來的物件會被立即釋放。

相關推薦

IOS學習—引用__strong 引用__weak

在Objective-C的ARC模式中, id obj1 = [[NSObject alloc] init]; 這裡雖然沒有顯示的宣告為__strong,但是Objective-C預設宣告的一個物件就為__strong,即: id obj1 = [[N

引用引用__strong__weak

初學者乾貨 在OC ARC模式下開發: id objcA =[ [NSObject alloc] init]; 預設宣告的一個物件就為__strong強引用,等價於: id __strong objcA =[ [NSObject alloc] init]; 注:在強引用

Java中的引用型別引用引用垃圾回收

Java中的引用型別和垃圾回收 強引用Strong References   強引用是最常見的引用:   比如: StringBuffer buffer = new StringBuffer();   建立了一個StringBuffer類的物件,並用一個變數buffer儲存對這個

Java中的引用引用

style 關系 term handle ren soft obj jsb false 旭日Follow_24 的CSDN 博客 ,全文地址請點擊: https://blog.csdn.net/xuri24/article/details/81114944 一、強引用

Java基礎篇 - 引用引用、軟引用引用

splay 查看 tla 之前 for 應用 幹貨 程序 策略 前言 Java執行GC判斷對象是否存活有兩種方式其中一種是引用計數。 引用計數:Java堆中每一個對象都有一個引用計數屬性,引用每新增1次計數加1,引用每釋放1次計數減1。 在JDK 1.2以前的版本中,若

引用引用

強引用是指向記憶體申請一段儲存空間,進行儲存的引用型別的物件的引用,如下建立一個強引用, object obj = new object();obj = 10; 在物件獲得的分配記憶體空間中不僅僅存放了物件的資訊,還存放著該物件被引用的次數。在建立一個強引用時,預設的引用次數為 1,之後每引用一

Java之"引用、軟引用 引用"

思考:Java中為何會有引用的概念? 思路:在Java裡,當一個物件M被建立的時候,它就被放在heap裡。當GC執行時,如果發現沒有任何引用指向物件M,M就會被回收,用以騰出記憶體空間。 總結:如果一個物件被回收,需要滿足兩個條件: 沒有任何引用指向它 觸發GC(

Java中的引用、軟引用引用引用及其例項

在《深入理解Java虛擬機器(第二版)》3.2.3節:再談引用 中,介紹了Java中的幾種引用: 在JDK 1.2以前,Java中的引用的定義很傳統:如果reference型別的資料中儲存的數值代表的是另外一塊記憶體的起始地址,就稱這塊記憶體代表著一

Java中的引用,軟引用引用引用

從JDK1.2版本開始,把物件的引用分為四種級別,從而使程式能更加靈活的控制物件的生命週期。這四種級別由高到低依次為:強引用、軟引用、弱引用和虛引用。 一、強引用 如果一個物件具有強引用,那就類似於必不可少的生活用品,垃圾回收器絕不會回收它。當記憶體空 間不足,Java虛

Java 的引用型別有哪幾種:引用、軟引用引用引用

Java雖然有記憶體管理機制,但仍應該警惕記憶體洩露的問題。例如物件池、快取中的過期物件都有可能引發記憶體洩露的問題。 從JDK1.2版本開始,加入了物件的幾種引用級別,從而使程式能夠更好的控制物件的生命週期,幫助開發者能夠更好的緩解和處理記憶體洩露的問題。 這幾種

引用引用引用

  轉載請註明地址:http://blog.csdn.net/yincheng886337/article/details/50479459 談到這四種引用,先讓我做個這樣的比喻,JVM好比你,記憶體

java物件的引用,軟引用引用引用

     眾所周知,java中是JVM負責記憶體的分配和回收,這是它的優點(使用方便,程式不用再像使用c那樣操心記憶體),但同時也是它的缺點(不夠靈活)。為了解決記憶體操作不靈活這個問題,可以採用軟引用等方法。      在JDK1.2以前的版本中,當一個物件不被任何變數引

重新理解strong與weak(引用引用),以及strongcopy的區別

- (void)test: {     NSMutableString *mStr = [NSMutableStringstringWithFormat:@"hello"];     self.sStr   = mStr;     self.cStr     = mStr;     NSLog

python3學習筆記之 引用引用

python中,名字和物件的關聯是強引用的關係,會增加引用計數,進而影響目標物件的生命週期。所以 弱引用就是在保留引用的前提下,不增加計數,不阻止目標被回收。但不是所有的型別都支援弱引用(如 int、str、list、tuple。。。等)這裡要提到解構函式 __del__當物

strong and weak 引用引用的區別

(weak和strong)不同的是 當一個物件不再有strong型別的指標指向它的時候 它會被釋放  ,即使還有weak型指標指向它。 一旦最後一個strong型指標離去 ,這個物件將被釋放,所有剩餘的weak型指標都將被清除。 可能有個例子形容是妥當的。 想象我們的物件是一條狗,狗想要跑掉(被釋放)。 s

android中四大引用的區別,引用、軟引用引用引用

強引用:使用的內容不可被回收,直到出現out of memory錯誤,android中沒有任何關鍵字指定這種強引用。 軟引用:         如果一個物件只具有軟引用,那麼如果記憶體空間足夠,垃圾回收器就不會回收它;如果記憶體空間不足了,就會回收這些物件的記憶體。只要垃圾

引用引用區別 引用引用區別

1.強引用 本章前文介紹的引用實際上都是強引用,這是使用最普遍的引用。如果一個物件具有強引用,那就類似於必不可少的生活用品,垃圾回收器絕不會回收它。 當記憶體空 間不足,Java虛擬機器寧願丟擲OutOfMemoryError錯誤,使程式異常終止,也不會靠隨意回收具有強引用的物件來解決記憶體

java引用,軟引用引用引用

開發十年,就只剩下這套架構體系了! >>>   

android 使用handle警告,,存在記憶體洩漏的危險,使用靜態內部類引用的方式解決。

Handle警告的原因:handle定義為內部類,會持有外部類的引用,如果外部類結束,handle因為執行耗時操作沒有結束,並持有外部類的引用,導致外部類佔用的記憶體不能釋放。 解決辦法:handle定義為靜態內部類,handle對於外部類的元件和方法的操作藉助弱引用來實現。 public

weakref模組引用

正是因為有引用,物件才會在記憶體中存在。當物件的引用數量歸零後,垃圾回收程式會把物件銷燬。 弱引用不會增加物件的引用數量,引用的目標物件稱為所指物件(referent)。常作快取使用。 一般我門會使用weakref包的集合(WeakKeyDictionary, WeakValueDictionary, W