野指標、記憶體洩露
阿新 • • 發佈:2019-02-02
#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; }