日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

十二:内存简单介绍和OC的内存管理

發布時間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 十二:内存简单介绍和OC的内存管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、內存簡單介紹

內存結構

1、運行時分配

(1)棧:用戶存放程序臨時創建的局部變量(先進后出)。

(2)堆:動態分配內存段。

2、編譯器分配

(1)BSS段:存放未初始化的全局變量和靜態變量。

(2)數據段:已初始化的全局變量和靜態變量。

(3)代碼段:執行代碼的一塊區域。

地址由低到高:代碼段 -> 數據段 -> BSS段-> 堆 -> 棧?

內存分配方式

1、從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static變量。

2、在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。

3、從堆上分配,亦稱動態內存分配。動態內存的生存期由程序員決定,使用非常靈活,但如果在堆上分配了空間,就有責任回收它,否則運行的程序會出現內存泄漏,頻繁地分配和釋放不同大小的堆空間將會產生堆內碎塊。

?

二、OC內存管理(iOS7.0后不用手動管理,可以了解相關原理)

1、進行內存管理的原因:是由于移動設備的內存極其有限,所以每個APP所占的內存也是有限制的,當app所占用的內存較多時,系統就會發出內存警告,這時需要回收一些不需要再繼續使用的內存空間,比如回收一些不再使用的對象和變量等。

2、內存管理范圍:任何繼承NSObject的對象,對其他的基本數據類型無效。

本質原因是存儲空間不一樣,對象存儲于堆中,而其它局部變量主要存放于棧中,當代碼塊結束時這個代碼塊中涉及的所有局部變量會被回收,指向對象的指針也被回收,此時對象已經沒有指針指向,但依然存在于內存中,造成內存泄露。

3、對象的基本結構:每個OC對象都有自己的引用計數器,是一個整數表示對象被引用的次數,即現在有多少東西在使用這個對象。對象剛被創建時,默認計數器值為1,當計數器的值變為0時,則對象銷毀。

在每個OC對象內部,都專門有4個字節的存儲空間來存儲引用計數器。

引用計數器的作用:判斷對象是否需要回收的唯一依據就是計數器是否為0,若不為0則存在。 4、當給對象發送消息時,進行引用計數器操作

Retain消息:使引用計數器+1,改方法返回對象本身

Release消息:使引用計數器-1(并不代表釋放對象)

retainCount消息:獲得對象當前的引用計數器值

5、當一個對象的引用計數器為0時,那么它將被銷毀,其占用的內存被系統回收。當對象被銷毀時,系統會自動向對象發送一條dealloc消息,一般會重寫dealloc方法,書寫格式如下:

1 - (void)dealloc 2 { 3 [super dealloc] //必須調用必須調用調用此方法,且必須寫在最后 4 }

6、注意事項:

野指針錯誤:訪問了一塊壞的內存(已經被回收的,不可用的內存)。

僵尸對象:所占內存已經被回收的對象,僵尸對象不能再被使用。(打開僵尸對象檢測)

空指針:沒有指向任何東西的指針(存儲的東西是0,null,nil),給空指針發送消息不會報錯

注意:不能使用[p retaion]讓僵尸對象起死復生。

7、內存管理原則

(1)只要還有人在使用某個對象,那么這個對象就不會被回收。

  ?只要你想使用這個對象,那么就應該讓這個對象的引用計數器+1。

  ?當你不想使用這個對象時,應該讓對象的引用計數器-1。

(2)誰創建,誰release

  ?如果你通過alloc,new,copy來創建了一個對象,那么你就必須調用release或者autorelease方法

  ?不是你創建的就不用你去負責

(3)誰retain,誰release。只要你調用了retain,無論這個對象時如何生成的,你都要調用release。

?

三、內存管理中的循環引用問題以及解決

若使用#import的方式相互包含,就會形成了循環引用。這時可以使用一個@class來代替其中一個#improt來解決循環引用問題,提高性能!

@class僅僅告訴編譯器,在進行編譯的時候把后面的名字作為一個類來處理。

書寫規范:@class 類名;

作用:聲明一個類,告訴編譯器某個名稱是一個類。

具體用法:1、在.h文件中使用@class來聲明類。

     2、在.m文件中真正要使用到的時候,使用#import來包含類中的所有東西。

     3、兩端循環引用的解決方法:一端使用retain,一端使用assign(使用assign的在dealloc中也不用再release)。

轉載于:https://www.cnblogs.com/hissia/p/5448410.html

總結

以上是生活随笔為你收集整理的十二:内存简单介绍和OC的内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。