阅读背景:

野指针、内存泄露

来源:互联网 

#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;
}
#import <Foundation/Foundation.h>
// 1 野指针 提早释放和反复




你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: