1. 程式人生 > >野指標、記憶體洩露

野指標、記憶體洩露

#import <Foundation/Foundation.h>
// 1 野指標 提前釋放和重複釋放
// 2 記憶體洩露
//記憶體管理原則(配對原則):只要出現了 new,alloc,retain,copy,就一定配對出現一個release,autorelease

#import "Person.h"

void test()
{
    // 1 記憶體洩露的第一種情況
    //        //1
    //        Person * p = [[Person alloc] init];
    //        NSLog(@"%lu",p.retainCount);
    //        //2
    //        [p retain];
    //        //3
    //        Person * q = [p retain];
    //        //2
    //        [p release];
    //        //1
    //        [q release];
    //        // 物件的 retainCount != 0 的時候不會呼叫 dealloc 函式銷燬物件,物件會一直存在記憶體中造成記憶體洩露
    
    // 2 記憶體洩露的第二種情況
    Person  * p = [[Person alloc] init];
    NSLog(@"%lu",p.retainCount);
    p = nil;
    //
    //        [p release]; //[nil release]
    NSLog(@"%lu",p.retainCount);
}

void test2()
{
    // 2 野指標 操作以及避免
    Person * p = [[Person alloc] init];
    NSLog(@"%lu",p.retainCount);
    Person * q = [p retain];
    [p release];
    p = nil;
    
    // 程式訪問了不可訪問的記憶體空間
    // 在指標 release 之後將指標置為 nil;
    [q release];
    q = nil;
    [q run];//[nil run]
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person * p = [[Person alloc] init];
        NSLog(@"%lu",p.retainCount);
        [p release];
        // 在一個物件呼叫 dealloc 函式銷燬之後是不會起死回生的
        // EXC_BAD_ACCESS 訪問了不可訪問的記憶體空間
        
        //[p retain];
    }
        return 0;
}