1.分配內存空間,存儲對象
2.初始化成員變量
3.反回對象的指針地址
1.對象在完成創建的同時,內部會自動創建一個引用計數器,這個計數器,是系統用來判斷是否回收對象的唯一依據,當我們的引用計數retainCount = 0的時候,系統會毫不猶豫回收當前對象
2.[對象 release] reatinCount - 1
3.[對象 retain] reatinCount + 1 ,返回self
4.我們的引用計數retainCount = 0的 對象就被銷燬了
/5.dealloc函數,當一個對象要被銷燬的時候,系統會自動調用dealloc函數,通知對象你將要被銷燬
內存管理原則(配對原則):只要出現了 new,alloc,retain,就一定配對出現一個release,autorelease
手動內存管理研究問題方法
1.野指針操作
2.內存泄漏
void test()
{
//retainCount = 1
Person * p = [[Person alloc] init];
p.age = 10;
NSLog(@"%@",p);
//retainCount = 0
//系統已經將p所指向的對象回收了
//EXC_BAD_ACCESS 訪問了不可訪問的內存空間
//被系統回收的對象我們稱之爲殭屍對象
//默認情況下xcode爲了提高編碼效率,不會時時檢查殭屍對象
[p release];
// NSLog(@"p所指向的對象回收了 %@",p);
// p.age = 20;//[p setAge:20];
[p run];
}
void test2()
{
Person * p = [[Person alloc] init];
p.age = 20;
NSLog(@"%@",p);
[p release];
//如果你確定當前作用於中的對象已經不會再被使用了,爲了防止野指針操作,通常我們會把不在使用的指針變量賦值爲nil
p = nil;
p.age = 30;//[nil setAge:30];
[p run]; //[nil run];
//避免野指針操作的方法 [nil resele]
}
void test3()
{
/*
//內存泄漏第一種情況
//1
Person * p = [[Person alloc] init];
p.age = 20;
NSLog(@"%@",p);
//2
[p retain];
//3
[p retain];
//2
[p release];
//只要對象的retainCount != 0 就會一直存在在內存中
//內存泄漏指的就是,不再被使用的對象,一直在內存中沒有被銷燬
*/
/*
//內存泄漏第二種情況
//retainCount = 1
Person * p = [[Person alloc] init];
p.age = 20;
[p run];
p = nil;
[p release];//[nil release];
*/
//1
Person * p = [[Person alloc] init];
p.age = 20;
[p run];
Person * p1 = p;
//0
// [p release];
[p1 release];
//野指針操作
p1.age = 20;
}
void test4()
{
//1
Person * p = [[Person alloc] init];
p.age = 20;
NSLog(@"%@",p);
//0
[p release];
//野指針操作,當一個對象retainCount已經爲0 時,調用retain方法,是不會使得對象起死回生的,同時還會發生野指針操作異常
[p retain];
}
void test5(Person * p)
{
p.age = 30;// release retain
[p retain]; //2
// [p release];
NSLog(@"%@",p);
}