OC手動內存管理注意事項

 創建對象
 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);
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章