標籤:
------ android培訓、java培訓、期待與您交流! ----------
1.OC記憶體管理
1)範圍:管理任何繼承NSObject的對象,對其他的基礎資料型別 (Elementary Data Type)無效(堆區),否則會造成記憶體泄露
2)原理:任何對象都可能有用一個或多個所有者,只要一個對象至少還擁有一個所有者,它就會繼續存在
3)對象的引用計數器,retain(+1)、release(-1)、retainCount得到引用計數器的值
4)記憶體管理的分類:MRC(手動管理)、ARC(自動管理)、記憶體回收(不支援)
2.引用計數器的使用
dealloc:釋放對象
先調用[super dealloc]
我們建立一個項目,預設是ARC模式,先修改
//// main.m// 記憶體管理//// Created by fanyafang on 15/11/6.// Copyright © 2015年 itcast. All rights reserved.//#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *p =[[Person alloc]init]; NSUInteger count=[p retainCount]; NSLog(@"%lu",count); //Person *p2=p;//不變 //Person *p2=[p retain];//加1 [p retain];//加1 [p release];//減一 [p release];//減一自動調用dealloc方法 //證明p的空間被釋放,可以在Person類中重寫dealloc方法 } return 0;}
3.記憶體管理的原則
1)只要有人使用這個對象,這個對象就不會被回收
2)只要你想使用這個對象,那麼就應該讓這個對象的引用計數器加1
3)當你不想使用這個對象時,應該讓對象的引用計數器減1
4)誰建立(new、malloc、copy)誰release
5)誰retain誰release
4.如果一個對象已經被釋放了,這個對象就成為殭屍對象,再去使用這個對象就沒有意義,預設不報錯,需要開啟殭屍對象檢測
不能使用retain讓殭屍對象起死回生
5.對象nil 類Nil NULL NSNull是一個對象
避免使用殭屍對象的方法是,對象釋放以後,給對象賦值為nil
6.多個對象的記憶體管理
在set函數中先release執行個體對象,再retain傳入的對象
//如果是同一個對象的話就不需要release和retain
if(_car!=car){
[_car release];
_car=[car retain];
}
在dealloc中,release執行個體對象
[_car release];
[email protected]參數
1.原子性atomic nonatomic
2.讀寫readwrite readonly
3.記憶體管理assign retain copy
替換get方法名稱setter=isVip,get方法名稱getter=isVip
[email protected]的使用
使用import引入標頭檔時,如果標頭檔的內容發生了變化,此時所有引用這個標頭檔的類都需要重新編譯
使用@class 類名;代替import
告訴編譯器xxx是一個類,不需要重新編譯
但是使用時會有提示錯誤,解決辦法,在.m檔案中再import一次
@class的可以解決迴圈引入問題,A類和B類互相import,使用class不會報錯
9.迴圈retain會導致兩個對象都會記憶體泄露
防止方法:1)讓某個對象多釋放一次(注意順序)
2)推薦方法:一端使用assign,另一端使用retain
10.NSString對象
[email protected]
如果一個方法需要放回一個建立的對象,該對象何時釋放?
方法內部不會釋放,因為這樣做會將對象立即釋放而返回一個Null 物件,調用者也不會主動釋放該對象
這個時候就發生了記憶體泄露
1)@autoreleasepool {}建立自動釋放池
2)[對象 autorelease];//加入自動釋放池,發送訊息,釋放池結束的時候調用對象的release
黑馬程式員-------Objective-C基礎3