iOS複習筆記4:記憶體管理

來源:互聯網
上載者:User

標籤:objective-c   ios   記憶體管理   

一 基礎原理
1 為什麼需要記憶體管理
因為行動裝置記憶體有限,每個app所佔用的空間有限。
當app佔用記憶體空間過多時,系統會發出記憶體警告,這是回收一些不在使用的記憶體。
例如:不再使用的類對象和執行個體。


2 管理對象
任何繼承自NSObject類的對象


3 記憶體地區
堆:主動分配空間,需要管理
棧:局部變數,自動管理
例如:
int a = 1;
Person* p = [[Person alloc] init];
a,p都放在棧區
Person分配的空間在堆區


二 引用計數
1 定義
每個OC對象都有一個引用計數,是一個4個位元組的整數,表示“被引用的次數”。
可以使用retainCount方法查看一個對象的引用計數。


2 作用
一個對象建立(alloc/new/copy)時為1;
引用計數變為0時,會被系統回收。
引用計數變不為0時,它佔用的記憶體不可能被回收,除非整個程式退出。


3 引用計數操作
retain +1
release -1


4 對象銷毀
一個對象引用計數為0時,其佔用的記憶體會被系統銷毀。
被銷毀時,系統會向對象發送一條dealloc訊息。
因此,一般需要重寫dealloc方法,首先調用父類的dealloc,然後釋放自己的資源。
對象銷毀後,其記憶體被回收,繼續使用會導致程式crash(野指標)。
*dealloc不能手動調用


樣本
@interface Person@property int m_nAge;@end@implementation Person- (void)dealloc{NSLog(@"dealloc");// 驗證對象是否被回收[super dealloc];}@end#import <Foundation/Foundation.h>int main(){// 預設為1Person* p = [[Person] init];NSUInteger count = [p retainCount];NSLog(@"retainCount == %ld", count);// +1,變為2,retain傳回值為對象本身[p retain];// -1,變為1[p release];// -1,變為0,被回收,被回收之後p變為野指標,指向的對象變為僵死對象// 不能對僵死對象發送任何訊息,包括retain[p release];// 報錯:EXC_BAD_ACCESS// p.m_nAge = 10// 防止野指標錯誤,因為給nil對象發送訊息不報錯,只有警告p = nil;// 開啟殭屍檢查之後才報錯:setXXX,message sent to deallocated instancep.m_nAge = 10return 0;}


使用被回收的對象報錯:EXC_BAD_ACCESS,訪問了一塊被回收的記憶體,即野指標錯誤


三 總結
1 基本方法
retain
release
retainCount
dealloc


2 概念
殭屍對象:所佔用內被回收的對象:
野指標:指向殭屍對象
null 指標:沒有指向任何地址,儲存的地址為0/NULL/nil

iOS複習筆記4:記憶體管理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.