1 . 基本方法使用
1> retain : 計數器 + 1 , 會傳回對象本身
2> release : 計數器 - 1 , 沒有傳回值
3> retainCount : 擷取目前的計數器
4> dealloc
* 當一個對象要背回收的時候, 就會調用
* 一定要調用[super dealloc] , 這句調用要放在最後面
2.概念
1>僵屍對象 : 所占用記憶體已經被回收的對象, 僵屍對象不能再使用
2>野指針 : 指向僵屍對象 (不可用記憶體) 的指針
3>空指針 : 沒有指向任何東西的指針(存儲的東西是nil, NULL , 0 ) , 給空指針發送消息不會報錯
注意:
1 . 想使用(占用) 某個對象 , 就應該讓對象的計數器+1 (retain操作)
2 . 不想使用(占用) 某個對象 , 就讓對象的計數器 -1 (release操作)
3 . 誰 retain , 誰 release
4 . 誰 release , 誰 release
記憶體管理代理規範
1.隻要調用alloc , 必須有 release (autorelease)
2.set方法的代碼規範
1>基本資料類型 :直接複制
-(void)setAge:(int)age
{
_age = age;
}
2> OC對象類型
- (void)setCar:(Car*)car
{
// 1. 先判斷是不是新傳進來的對象
if( car != _car)
{
// 2. 對舊對象做一次release
[ _carrelease ]; // 第一次調用為 nil
// 3. 對新對象做一次retain
_car = [carretain];
}
}
3 . dealloc 方法的代碼規範
1> 一定要調用[super dealloc] , 而且要放到最後面
2> 對self(目前對象) 所擁有的其他對象做一次release
- (void)dealloc
{
[ _carrelease];
[ superdealloc];
}
ARC automaticReference Counting 自動引用計數
ARC 編譯器特性
編譯器會在适當時候,加入記憶體管理的代碼
強指針:預設所有的指針都是強指針
隻要是有強指針指向一個對象,那麼這個對象就不會被釋放
隻要是沒有強指針指向一個對象,那麼這個對象就被立即回收
__strong 強指針标示,但是預設所有指針都是強指針,是以他沒有用
弱指針:弱指針指向的對象不影響對象回收
注意:不要用弱指針指向一個剛剛建立出來的對象
當出現循環引用的時候,必須要由一端是弱指針
----------------------------------------------------------------------------
案例 :
#import <Foundation/Foundation.h>
#import "CZPerson.h"
/*
如果記憶體管理不當
1、不再使用對象沒有被回收,記憶體洩露,最終導緻程式閃退
2、正在被使用對象被釋放了,野指針,通路野指針就會導緻程式崩潰
ARC Automatic Reference Counting 自動引用計數
MRC Manual Reference Counting 手動引用計數
1、當一個對象剛剛出生時候,它的引用計數 1
2、當對象上引用計數是0的時候,系統立即把它回收
3、release 引用計數-1
4、retain 引用計數+1
int main(int argc, const char * argv[]) {
CZPerson *person =[[CZPerson alloc] init];//1
long count = [person retainCount];
NSLog(@"%zd",count);
[person retain];//2
NSLog(@"%zd",[personretainCount]);
[person release];//0
NSLog(@"%zd",[personretainCount]);
[person release];
// person = nil;
// 當一個指針指向 nil,這個指針我稱為空指針
// 給空指針發送消息系統不會報錯,它什麼都不做
[person test];
[person dealloc];
NSLog(@"%zd",[personretainCount]);//
return 0;
}
#import <Foundation/Foundation.h>
@interface CZPerson : NSObject
- (void) test;
@end
@implementation CZPerson
- (void) test
{
NSLog(@"CZPerson");
}
//永遠不要試圖自己調用這個方法
-(void) dealloc
{
// 這裡可以驗證對象是否被回收了
NSLog(@"CZPerson回收");
// 這個方法中必須調用父類該方法,并且必須放在最後
[super dealloc];
}
@end