1. 程式人生 > >iOS 的記憶體與儲存區域

iOS 的記憶體與儲存區域

棧區(stack)

概述:棧是向低地址擴充套件的資料結構,是一塊連續的記憶體區域。由棧頂的地址和棧的最大容量是系統預先規定好的。棧的空間很小,大概1-2M。超出overflow。

使用:棧區,就是函式(方法)執行時向系統請求的記憶體。棧中的區域性變數,引數由編譯器分配和釋放,函式執行就分配,函式結束就釋放,由系統完成。是系統資料結構,對應程序唯一。

特別注意:系統棧的剩餘空間 大於 所申請的空間,系統為程式提供記憶體,不然,報錯異常,提示棧的溢位。

堆區(heap)

概述:堆是向高地址擴充套件的資料結構,不連續的記憶體區域。系統用連結串列儲存空閒地址的。連結串列遍歷由低向高。堆大小直接受裝置有效虛擬記憶體影響。

1.首先應該知道作業系統有一個記錄空閒記憶體地址的連結串列。
2.當系統收到程式的申請時,會遍歷該連結串列,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閒結點連結串列中刪除,並將該結點的空間分配給程式。
3.由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閒連結串列中

使用: 存放實體物件的。由程式設計師分配和釋放(arc自動插入分配和釋放程式碼),例如alloc 申請的會放入堆中。

全域性\靜態區(static)

靜態變數和全域性變數是儲存在一起的。初始化的全域性變數和靜態變數存放在一塊區域,未初始化的全域性變數和靜態變數在相鄰的另一塊區域,程式結束後有系統釋放。

int a;//未初始化的靜態區
int b = 10;//初始化的靜態區

文字常量區

存放常量字串,程式結束系統釋放

程式程式碼區

存放函式的二進位制程式碼

相關經典面試題

  1. 這段程式碼有什麼問題,哪一方面的,怎麼優化呢?

    - (void) interviewForStackMemory
    {
       for (int i = 0;i<1000000;i++)
       {
          NSString *str = @"小蘿莉";
          str = [str stringByAppendingString:@"是春哥的"];
       }
    }

  2. 以下資料和變數都儲存在那一類記憶體中

    int a;int c = 10;
    NSString *name1;NSString *name2 = @"lxx";
    - (void) interviewForStore
    {
       int b;
       NSString *name3 = @"hyc";
       NSString *name4;
       char h[] = "plm";
       static int k = 0;
    
       NSString *m = [[NSString alloc]initWithFormat:@"le"];
    }
    

相關推薦

iOS記憶體儲存區域

棧區(stack) 概述:棧是向低地址擴充套件的資料結構,是一塊連續的記憶體區域。由棧頂的地址和棧的最大容量是系統預先規定好的。棧的空間很小,大概1-2M。超出overflow。 使用:棧區,就是函式(方法)執行時向系統請求的記憶體。棧中的區域性變數,引數由

iOS開發技巧之:相簿中的GIF圖片的讀取儲存

大家都知道iOS的系統相簿是不支援gif圖片預覽的。但是,這並不代表系統相簿不能儲存和讀取gif圖片。通過Safari長按gif圖片,選擇儲存到相簿,這時儲存到相簿裡的圖片就是gif的,雖然它不會動。 下面將介紹如何對系統相簿進行gif的讀取與儲存。 什麼是 UTI iOS系統相

Redis記憶體使用優化儲存

Redis常用資料型別 Redis最為常用的資料型別主要有以下五種: String Hash List Set Sorted set 在具體描述這幾種資料型別之前,我們先通過一張圖瞭解下Redis內部記憶體管理中是如何描述這些不同資料型別的: 首先Re

簡述資料結構:棧記憶體記憶體儲存方式 js中的原始值

在討論堆疊前,先要明確什麼是原始值、引用值。 1.變數可以存放兩種型別的值: 原始值 和 引用值 2.原始值代表原始資料型別的值,也叫基本資料型別,包括 Number、Stirng、Boolean、Null、Underfined。 3.引用值指的是複合資料型別的

[轉]大內高手—共享記憶體執行緒區域性儲存

2007-11-06 城裡的人想出去,城外的人想進來。這是《圍城》裡的一句話,它可能比《圍城》本身更加有名。我想這句話的前提是,要麼住在城裡,要麼住 在城外,二者只能居其一。否則想住在城裡就可以住在城裡,想住在城外就可以住在

計算機概論:02---電腦主機板架構、CPU、記憶體、顯示卡、硬碟儲存裝置、擴充套件卡介面、主機板、主機電源簡介

一、電腦主機板架構 1.概念:主機板是連線各元件的重要部分。主機板上連線各部分元件的晶片組,其設計優劣,會影響電腦的效能 2.晶片組 ①早期晶片組:早期的晶片組通常分為兩個網橋來控制各元件的通訊 北橋:負責連線速度較快的CPU、記憶體與顯示卡等元件 南橋:負責連線速度

Redis 記憶體使用優化儲存

Redis 常用資料型別Redis最為常用的資料型別主要有以下五種:• String• Hash• List• Set• Sorted set在具體描述這幾種資料型別之前,我們先通過一張圖瞭解下 Redis 內部記憶體管理中是如何描述這些不同資料型別的:首先 Redis 內部

iOS 圖片記憶體

第一種解決方法:選擇適當的載入方式 在程式的開發過程中,經常會用到很多的圖片,適當的選擇載入圖片的方式就顯得格外的重要,如果選擇不得當,很容易造成記憶體吃緊而引起程式的崩潰。 這裡介紹一下幾種常見的載入方式: 用UIImage載入影象的方法很多,最常用的是下面兩種: 

iOS-MRCARC區別以及五大記憶體

個人覺得要更加深入直觀瞭解MRC與ARC的區別建議先從記憶體分析開始所以文章開始會從記憶體起 文章目錄 1.五大記憶體區域 1.1 棧區 1.2 堆區 1.3 全域性區 1.4 常量區 1.5 程式碼區 1.6 自由儲存區 1.7 stat

75.iOS使用KeyChain儲存資料不同App間共享資料

//研究了一天發現網路上大部分關於keychain的講解都不詳細......自己更是踩雷踩了一天才把KeyChain使用與共享資料研究成功分享到這裡希望大家不用再勞累這麼一次 Apple文件上說

c語言程式的儲存區域const關鍵字的使用方法

一.C語言程式的儲存區域1.由C語言程式碼(文字檔案)形成可執行程式(二進位制檔案),需要經過編譯-彙編-連線三個階段。編譯過程把C語言文字檔案生成彙編程式,彙編過程把彙編程式形成二進位制機器程式碼,連線過程則將各個原始檔生成的二進位制機器程式碼檔案組合成一個檔案。2.C語言

C#中的記憶體管理(二)儲存區域劃分

首先,我們先了解一下資料在記憶體中的儲存方式,根據變數值的生存週期,可以分為靜態儲存區和動態儲存區。如下: 所謂靜態儲存區是指在程式執行期間分配固定的儲存空間的方式,而動態儲存區是指程式執行期間根據需要進行動態分配儲存空間的方式。 靜態變數和全域性變數儲存在靜態儲存區,在

C++記憶體儲存區域:堆區棧區以及new delete

C/C++記憶體大概有: 1:棧區,它是有系統自動分配和釋放,速度快效率高,但不自由;區域性變數,函式引數,返回值等都儲存在這個區域。 2:堆區,它是由程式設計師能過new或malloc自己分配的,不過在不需要的時候也需要自己通過delete和free釋放記

C語言—記憶體的五大區域/C、C++在記憶體中的儲存方式

簡單來說,C/C++在記憶體中的儲存佔用五個區域,分別是:棧區Stack、堆區Heap、BSS區、資料區(常量區)Data和程式碼區Text。其中,棧區由系統在編譯過程中自動分配;堆區在程式的執行過程中動態分配,由程式設計師控制堆區儲存的開闢和釋放;程式中的常量資料被分散在兩個區記憶體儲,一個是BSS區,儲存

iOS 數據儲存--歸檔

sea 。。 property append direct mobile mas rect bsp 四種數據持久化方式 http://www.cocoachina.com/ios/20160617/16739.html //先把數據在model中歸解檔 。h @pro

Python下opencv使用筆記(一)(圖像簡單讀取、顯示儲存

操作 灰度圖 清晰 ren from tty ims 圖像 type 寫在之前 從去年開始關註python這個軟件,途中間間斷斷看與學過一些關於python的東西。感覺python確實是一個簡單優美、easy上手的腳本編程語言,眾多的第三方庫使得py

ASA 防火墻的 inside區域outside區域

每個設備的配置都已給出 註:測試用telnet來測試因為ASA默認之給TCP與UDP形成CONN表icmp協議不能形成CONN表所以用ping方式來測試是ping不通的是正常現象 ASA.配置: ciscoasa# show running-config: Saved:ASA Version 8.4(2)!h

eNSP分析OSPF分析stub區域普通區域的區別,並驗證stub區域的特性

命令 pla outer 外部網絡 watermark ner 分析 比較 work 實驗目的:分析stub區域與普通區域LSA通告以及路由條目的區別思路:建立ospf區域,並註入外部路由,分析各區域的LSA以及路由信息,然後將沒有註入外部路由的普通區域設置成stub區域,

eNSP環境,分析NSSA區域Stub區域的區別

router-id 6.0 鏈路 oss imp 鏈路狀態 roc 表示 ssa區域 實驗目的:1、分析NSSA區域內,有哪幾類LSA2、NSSA區域導入外部路由之後,區域內LSA的變化3、totally NSSA區域的LSA變化4、分析NSSA與Stub的區別一、搭建以下

堆內記憶體對外記憶體區別

名詞解釋:     堆內記憶體:on-heap memory     對外記憶體:off-heap memory 堆內與堆外的關係      其實堆內堆外是兩個相對的關係,堆內記憶體是我們常用到的。Java分