強引用和弱引用(__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(強引用,弱引用),以及strong和copy的區別
- (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