1. 程式人生 > >Objective-C Autorelease Pool 的實現原理

Objective-C Autorelease Pool 的實現原理


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

autoreleased 物件什麼時候釋放

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

:本實驗的原始碼可以在這裡 AutoreleasePool 找到。

特別說明:在蘋果一些新的硬體裝置上,本實驗的結果已經不再成立,詳細情況如下:

  • iPad 2
  • iPad Air
  • iPad Air 2
  • iPad Pro
  • iPad Retina
  • iPhone 4s
  • iPhone 5
  • iPhone 5s
  • iPhone 6
  • iPhone 6 Plus
  • iPhone 6s
  • iPhone 6s Plus
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 28 29 30 31 32 33 34
__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
5
6
7
8
9
10
11
12
13
14
// 場景 1
2015-05-30 10:32:20.837 AutoreleasePool[33876:1448343] string: leichunfeng
2015-05-30 10:32:20.838 AutoreleasePool[33876:1448343] string: leichunfeng
2015-05-30 10:32:20.845 AutoreleasePool[33876:1448343] string: (null)

// 場景 2
2015-05-30 10:32:50.548 AutoreleasePool[33915:1448912] string: (null)
2015-05-30 10:32:50.549 AutoreleasePool[33915:1448912] string: (null)
2015-05-30 10:32:50.555 AutoreleasePool[33915:1448912] string: (null)

// 場景 3
2015-05-30 10:33:07.075 AutoreleasePool[33984:1449418] string: leichunfeng
2015-05-30 10:33:07.075 AutoreleasePool[33984:
            
           

相關推薦

Objective-C Autorelease Pool實現原理

記憶體管理一直是學習 Objective-C 的重點和難點之一,儘管現在已經是 ARC 時代了,但是瞭解 Objective-C 的記憶體管理機制仍然是十分必要的。其中,弄清楚 autorelease 的原理更是重中之重,只有理解了 autorelease 的原理,我們才算是真正瞭解了 Obje

C#中foreach實現原理

示例 元素 res 過程 false 編程語言 static posit this 本文主要記錄我在學習C#中foreach遍歷原理的心得體會。 對集合中的要素進行遍歷是所有編碼中經常涉及到的操作,因此大部分編程語言都把此過程寫進了語法中,比如C#中的foreach。經

c++多態實現原理

c++編譯器 anim 被調用 虛指針 編譯 基類 綁定 確定調用 包括 C++的多態性用一句話概括就是:在基類的函數前加上virtual關鍵字,在派生類中重寫該函數,運行時將會根據對象的實際類型來調用相應的函數。如果對象類型是派生類,就調用派生類的函數;如果對象類型是基類

C# ConcurrentBag的實現原理

基礎 滿足 represent safe 接下來 finally 頭指針 tlist 進行 目錄 一、前言 二、ConcurrentBag類 三、 ConcurrentBag線程安全實現原理 1. ConcurrentBag的私有字段 2. 用於數據存儲的TrehadLo

探究Objective-C中關聯物件原理

一、實際問題 1.提出問題 首先,一切都要從一個問題開始:在Objective-C中,能否在Category中為類新增屬性及對應的例項變數? 該題的答案是:不能。 2.分析解答 為什麼不能通過Category來為Objective-C的類新增屬性及對應的例項變數

iOS UI入門——使用Objective-C和Swift實現警告檢視和操作列表(UIAlertView,UIActionSheet,UIAlertController)

警告彈框和操作列表在開發中常用到,iOS9之後,UIAlertView和UIActionSheet都會報黃色的警告,但是還是依然可以使用的。在這裡主要介紹一在這三個控制元件在Objective-C和Swift下的使用程式碼。 Objective-C程式碼: #import "Vi

C++虛繼承實現原理

首先給出以下繼承關係,以便描述虛繼承原理: class AAA { public: int age; }; class BBB:virtual public AAA//變為虛繼承,A變為虛基類 { }; class CCC:virtual public AAA { }

C++函式過載實現原理淺析

版權宣告:本文首發於http://blog.csdn.net/candcplusplus,轉載請註明出處...    https://blog.csdn.net/shimachao/article/details/12746975 -------------------

淺談C++多型實現原理(虛繼承的奧祕)

大夥都知道,如果要實現C++的多型,那麼,基類中相應的函式必須被宣告為虛擬函式(或純虛擬函式)。舉個例子: class Point { public: Point(float x = 0.0, float y = 0.0) : _x(x), _y(y) { } virtual fl

C++(多型實現原理)函式重寫,過載,重定義

多型的實現原理:          首先介紹下函式重寫 重定義 過載的區別; 函式重寫:          發生在父類和子類之間,子類將父類中的同名函式進行了覆蓋,如果在函式前面含有virtual那麼就是重寫,如果沒有就成了覆蓋,子類的同名函式將會覆蓋(隱藏)父類的同名

Objective-c利用協議實現回撥函式

定義協議: #import <UIKit/UIKit.h> @protocol myViewDelegate -(void) CallBackFun; @end 呼叫協議: #import <Foundation/Foundation.h>

Objective-CAutorelease Pool底層實現原理記錄(雙向連結串列)以及在Runloop中是如何參與進去的

最近需要重新整理知識點備用,把一些重要的原理都搞了一遍 前言 int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, a

Objective-C Associated Objects 的實現原理

單獨 維護 borde 強引用 否則 高手 nag 研究 pro 我們知道,在 Objective-C 中可以通過 Category 給一個現有的類添加屬性,但是卻不能添加實例變量,這似乎成為了 Objective-C 的一個明顯短板。然而值得慶幸的是,我們可以通過 As

Objective-C runtime機制(6)——weak引用的底層實現原理

前言 提起弱引用,大家都知道它的作用: (1)不會新增引用計數 (2)當所引用的物件釋放後,引用者的指標自動置為nil 那麼,圍繞它背後的實現,是怎麼樣的呢?在許多公司面試時,都會問到這個問題。那麼,今天就帶大家一起分析一下weak引用是怎麼實現的,希望能夠搞清楚每一個細節。 S

C++ 叠代器原理、失效和實現

通過 print per 容器 struct gin net 嵌入 fin 目錄 叠代器的使用 叠代器的種類 叠代器的失效 叠代器的實現 1.叠代器的使用 為了提高C++編程的效率,STL中提供了許多容器,包括vector、list、map

[Go] sync.Pool實現原理 和 適用場景

臨時 digg 簡單的 設置 com 運行 之前 結果 官方文檔 摘錄一: Go 1.3 的 sync 包中加入一個新特性:Pool。 官方文檔可以看這裏 http://golang.org/pkg/sync/#Pool 這個類設計的目的是用來保存和復用臨時對象,以減

C++多態的實現原理

記得 找到 內部 轉載 文件 調用函數 參數 角度 個數 轉載自http://blog.csdn.net/tujiaw/article/details/6753498 1. 用virtual關鍵字申明的函數叫做虛函數,虛函數肯定是類的成員函數。2. 存在虛函數的類都有一個一

C++ 多態的實現原理

編譯 實現原理 父類 調用 blog 區分 所有 存儲 print 當類中聲明虛函數時,編譯器會在類中生成一個虛函數表 虛函數表是一個存儲類成員函數指針的數據結構 虛函數表是由編譯器自動生成與維護的 virtual成員函數會被編譯器放入虛函數表中 存在虛函數時,每個對象

漫談 C++ 的 內存堆 實現原理

當前 就是 問題 spa 設計 所在 內存 vision 分配 如果我來設計 C++ 的 內存堆 , 我會這樣設計 : 進程 首先會跟 操作系統 要 一塊大內存區域 , 我稱之為 Division , 簡稱 div 。 然後

C++函式模板及實現原理

    C++為我們提供了函式模板機制。所謂函式模板,實際上是建立一個通用函式,其函式型別和形參型別不具體指定,用一個虛擬的型別來代表。這個通用函式就稱為函式模板。     凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義