手動內存管理--MRC數組
掌握內容網絡
>理解內存管理的原理數據結構
>掌握手動內存管理MRC多線程
>掌握內存管理在實際工程中的使用app
(一)模塊化
1.理解部分函數
1.1內存管理 (傳統內存管理demo)ui
1.1.1內存管理作了一件什麼事?spa
內存管理就是確保開闢的堆空間獲得正確的釋放線程
若是堆空間沒有釋放,稱爲內存泄露
使用已釋放的堆空間,稱爲提早釋放
重複釋放同一個空間,稱爲重複釋放
1.1.2傳統內存管理的困境
(1)當咱們要釋放一個堆,首先要肯定使用這個堆的指針,都訪問完畢,避免提早釋放。
(2)釋放指針指向的堆空間,首先要肯定那些指針指向同一個堆,這些指針,只能釋放一次,避免重複釋放。
(3)模塊化操做,那個模塊負責釋放,將成爲最大的難題
(4)多線程的操做,不卻定那個線程最後使用完畢
1.1.3 困境的解決方法
【引用計數器】
引用計數簡稱計數器,某一個指針指向了一個對象,引用計數加1,減小一個指針指向對象,引用計數減1,當引用計數爲0的時候,由系統自動釋放該對象佔用的空間(模擬多人網絡遊戲,鬥地主、QQ堂)
新創建一個對象,系統會自動給該對象添加一個引用計數(retaincount)的屬性
1.1.4 內存管理的黃金法則
1,凡是用alloc,retain,new(或者以new開頭的方法),copy(或者copy開頭的方法),mutableCopy(或者muTableCopy開頭的方法)建立的對象,都須要用release或者autorelease釋放。
2,誰建立誰釋放(哪個類建立,哪個類釋放,誰寫alloc,誰寫release)
1.1.5 如何將工程改成MRC
1點擊工程-》build settings->經過gar關鍵字的搜索搜出Automatic Re..Cou..
->將此選項的設置改稱NO
1.2.1 alloc與release
alloc建立對象的過程,同時會將對象引用計數0加1,變成1
retain使對象引用計數器加1
release 會使對象引用次數減1
1.2.2析構函數
- (void)dealloc方法的注意事項
dealloc,稱爲析構函數,調用順序和構造函數相反,通常狀況下會在該函數中作一些釋放內存工做
是在引用計數減爲0時纔會被調用(能夠用來驗證對象是否被釋放)
語法:
-(void)dealloc { // 注意內部代碼順序 //1.全部成員對象調用一遍release //[super dealloc] 要寫到dealloc的自後一行,[super dealloc]是真正釋放當前的對象 [super dealloc]; }
1.2.3 類的複合中使用
retain 和assign(編譯器特性)
retain 展開
-(void)setDog:(Dog *)dog { if (_dog!=dog) { [_dog release]; _dog=[dog retain]; } }
assign展開
-(void)setDog:(Dog *)dog { _dog=dog; }
1.2.3 autorelease與autoreleasepool
autoreleasepool 自動釋放池,管理池子中的對象
autorelease,給對象發送autorelease消息時,會將對象存入autoreleasepool,當系統執行完自動釋放池時,自動釋放池會自動清空池子裏邊的對象
【注】自動釋放池相似於一個數組,進行延遲釋放,不會立刻計數器減一,而是將當前對象放入最近的自動釋放池中,當釋放池釋放的時候將池中每個元素都釋放一次
+方法的內存管理
+(Student*)create { Student *student=[[[Student alloc]init]autorelease]; // [student autorelease]; return student; }
【注意事項】
1,對象的成員變量在構造方法中建立,應該在析構函數中釋放
2,注意指針的轉移,釋放舊對象,保留新對象
3,從數據結構中如數組中讀取出對象地址,若是須要長時間使用應當retain
1.2.4 字符串內存管理
1.2.4.1 字符串的內存管理
1>@「」建立出來的字符串在只讀數據段,是隻讀的,引用計數爲-1,默認的是autorelease對象不能給它發 送retainCount++ 或 retainCount - - 的消息
2>alloc retain copy mutablecopy new建立出的字符串均須要release
3>類方法建立出的字符串和直接賦值的字符串,不須要手動管理內存
1.2.4.2 copy和mutableCopy(只用來複制字符串)
1>copy發消息,可變和不可變字符串均轉換成不可變字符串
NSMutableString *mulStr=[[NSMutableString alloc]initWithString:@"abc"]; NSString *str=@"a"; NSMutableString *mulStr2=[mulStr copy]; [mulStr2 appendString:@"aa"];
2>mutableCopy,不管是可變仍是不可變字符串,都將轉換可變字符串
NSMutableString *mulString=[[NSMutableString alloc]initWithString:@"abc"]; NSString *str=@"ab"; NSMutableString* mulStr= [str mutableCopy]; [mulString appendString:@"ab"];
1.2.5 數組的內存管理
1>在可變數組中,經過添加和刪除對象,都可以對該對象的引用計數加1和減1
2>在不可變數組中初始化時,初始化的對象的引用計數會加1,當該數組銷燬的時候(release),數組會給初始化的對象的引用計數減1