1. 程式人生 > >IOS記憶體管理--自動釋放池的實現原理

IOS記憶體管理--自動釋放池的實現原理

原文連結:http://www.cocoachina.com/ios/20150610/12093.html

記憶體管理一直是學習 Objective-C 的重點和難點之一,儘管現在已經是 ARC 時代了,但是瞭解 Objective-C 的記憶體管理機制仍然是十分必要的。其中,弄清楚 autorelease 的原理更是重中之重,只有理解了 autorelease 的原理,我們才算是真正瞭解了 Objective-C 的記憶體管理機制。注:本文使用的 runtime 原始碼是當前的最新版本 objc4-646.tar.gz 。

autoreleased 物件什麼時候釋放

autorelease 本質上就是延遲呼叫 release ,那 autoreleased 物件究竟會在什麼時候釋放呢?為了弄清楚這個問題,我們先來做一個小實驗。這個小實驗分 3 種場景進行,請你先自行思考在每種場景下的 console 輸出,以加深理解。注:本實驗的原始碼可以在這裡 

AutoreleasePool 找到。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 __weak NSString *string_weak_ = nil; - (void)viewDidLoad { [super viewDidLoad]; // 場景 1 NSString *string = [NSString stringWithFormat:@
"leichunfeng"]; string_weak_ = string; // 場景 2 //    @autoreleasepool { //        NSString *string = [NSString stringWithFormat:@"leichunfeng"]; //        string_weak_ = string; //    } // 場景 3 //    NSString *string = nil; //    @autoreleasepool { //        string = [NSString stringWithFormat:@"leichunfeng"];
//        string_weak_ = string; //    } NSLog(@"string: %@", string_weak_); } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; NSLog(@"string: %@", string_weak_); } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; NSLog(@"string: %@", string_weak_); }

思考得怎麼樣了?相信在你心中已經有答案了。那麼讓我們一起來看看 console 輸出:

1 2 3 4

相關推薦

IOS記憶體管理--自動釋放實現原理

原文連結:http://www.cocoachina.com/ios/20150610/12093.html 記憶體管理一直是學習 Objective-C 的重點和難點之一,儘管現在已經是 ARC 時代了,但是瞭解 Objective-C 的記憶體管理機制仍然是十分必要的。其中,弄清楚 auto

IOS記憶體管理,ARC,MRC,自動釋放(基礎)

在IOS中記憶體管理幾乎是每個人必須知道的一個知識點。首先我們總結一下MRC,再通過MRC來認識ARC以及自動釋放池 1.MRC 1.1 淘汰的技術 1.2 引用計數(RC)是指alloc自動分配的一塊兒儲存空間,用於儲存持有該空間的指標個數 1.3 使

iOS記憶體管理的那些事兒-原理實現

作者簡介 boyce,餓了麼物流團隊資深iOS開發。曾在格瓦拉等公司從事iOS相關研發工作。 注:本篇文章是《iOS記憶體管理的那些事兒》系列文章的第一部分。稍後我們會持續更新第二部分(開源監測記憶體洩漏的實現)和第三部分(如何利用開源工具做相關的APM),感興趣的童鞋可以關注我們專欄並獲取實

記憶體管理自動釋放與ARC的區別

手動計數就不用提了,但自動釋放池與arc分不清,一開始聽MJ講課時,總是自己release,當我release物件時,就會出現arc禁止,當時也不知道怎麼回事,後來知道了arc是自動引用計數,但是還是不懂與自動釋放池的區別。 自動釋放池是NSAutorelea

關於對iOS自動釋放autoreleasepool的一些理解

因為現在大家都在使用ARC模式下進行程式設計,一個很重要的問題也是最容易被大家所忽視的問題就是自動釋放池,大部分程式設計師尤其是剛入行的都只是知道有這麼一個東西,但具體是什麼,工作的原理是什麼,在什麼時候使用它都一概不知。所以寫一篇文章,記錄一下個人對自動釋放池的一些理解。

ios自動釋放(autoreleasepool)

#import <Foundation/Foundation.h> @interface Test : NSObject @end @implementation Test @end int main (int argc, const char * a

使用sun.misc.Cleaner或者PhantomReference實現堆外記憶體自動釋放

我之前的一篇部落格:System.gc()和-XX:+DisableExplicitGC啟動引數,以及DirectByteBuffer的記憶體釋放文章末尾處:提到java NIO包是通過sun.misc.Cleaner和PhantomReference來實現堆外記憶體的自

nginx源代碼分析之內存實現原理

delete align 業務 -s 首部 ges hand 重置 mar 建議看本文檔時結合nginx源代碼。1.1 什麽是內存池?為什麽要引入內存池?內存池實質上是接替OS進行內存管理。應用程序申請內存時不再與OS打交道。而是從內存池中申請內存或者釋放內存到內存

Java數據庫連接實現原理

fix 獲取 時有 .get soft div port 構造 定義 一般來說,Java應用程序訪問數據庫的過程是:   ①裝載數據庫驅動程序;   ②通過jdbc建立數據庫連接;   ③訪問數據庫,執行sql語句;   ④斷開數據庫連接。 [java] v

數據庫連接實現原理

出現 ins 初始化 基本原理 實現 plain comment 數據庫 ber 一、為什麽在連接數據庫時要使用連接池 數據庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現得尤為突出。 一個數據庫連接對象均對應一個物理數據庫連接,每次操作都打開一個

Docker容器可以使用容器平臺管理自動重啟實現自修復嗎?

引入 管理 寫代碼 過多 來講 dock 網易 一個 doc 容器的自修復功能是經常被吹噓的。因為容器是衣服,人躺下了,衣服也躺下了,容器平臺能夠馬上發現人躺下了,於是可以迅速將人重新喚醒工作。 而虛擬機是房子,人躺下了,房子還站著。因而虛擬機管理平臺不知道裏面的人能不

Java線程實現原理與技術

到來 res ble 的區別 數據庫連接 sca 講解 屬性 活動 本文將通過實現一個簡易的線程池理解線程池的原理,以及介紹JDK中自帶的線程池ThreadPoolExecutor和Executor框架。 1.無限制線程的缺陷 多線程的軟件設計方法確實可以最大限度地發揮

自動釋放——autoreleasepool

當您向一個物件傳送一個autorelease訊息 時,cocoa就會將該物件的一個引用放入到最新的自動釋放池,它仍然是個正當的物件,因此自動釋放池定義的作用域內的其他物件可以向它傳送訊息,當程式執行到作用域結束的位置時,自動釋放池就會釋放,池中的所有的物件也就被釋放 1、objective-c

iOS 記憶體管理研究

iPhone 作為一個移動裝置,其計算和記憶體資源通常是非常有限的,而許多使用者對應用的效能卻很敏感,卡頓、應用回到前臺丟失狀態、甚至 OOM 閃退,這就給了 iOS 工程師一個很大的挑戰。 網上的絕大多數關於 iOS 記憶體管理的文章,大多是圍繞 ARC/MRC、迴圈引用的原理或者是如何找尋記憶體洩漏來展

Java執行緒實現原理與技術I

無限制執行緒的缺陷 多執行緒的軟體設計方法確實可以最大限度地發揮多核處理器的計算能力,提高生產系統的吞吐量和效能。但是,若不加控制和管理的隨意使用執行緒,對系統的效能反而會產生不利的影響。 一種最為簡單的執行緒建立和回收的方法類似如下: new Thread(new 

Objective-C runtime機制(5)——iOS 記憶體管理

概述 當我們建立一個物件時: SWHunter *hunter = [[SWHunter alloc] init]; 上面這行程式碼在棧上建立了hunter指標,並在堆上建立了一個SWHunter物件。目前,iOS並不支援在棧上建立物件。 iOS 記憶體分割槽 iOS

Java併發(二十一):執行緒實現原理 Java併發(十八):阻塞佇列BlockingQueue Java併發(十八):阻塞佇列BlockingQueue Java併發程式設計:執行緒的使用

一、總覽 執行緒池類ThreadPoolExecutor的相關類需要先了解:  (圖片來自:https://javadoop.com/post/java-thread-pool#%E6%80%BB%E8%A7%88) Executor:位於最頂層,只有一個 execute(Runnab

Java併發:執行緒實現原理

一、總覽 執行緒池類ThreadPoolExecutor的相關類需要先了解: Executor:位於最頂層,只有一個 execute(Runnable runnable) 方法,用於提交任務。 ExecutorService :在 Executor 介面的基礎上添加了很多的介面方法,提交任務

Java併發(二十一):執行緒實現原理

Java併發(二十一):執行緒池實現原理 一、總覽 執行緒池類ThreadPoolExecutor的相關類需要先了解:  (圖片來自:https://javadoop.com/post/java-thread-pool#%E6%80%BB%E8%A7%88) E

iOS 記憶體管理(補充)

  物件操作 OC中對應的方法 對應的 retain Count 變化 生成並持有物件 alloc/new/copy/mutableCopy等 +1 內容單元