• Objective-C 【多个对象内存管理(野指针&内存泄漏)】


    ———————————————————————————————————————————

    多个对象内存管理(野指针&内存泄漏)


    (注:这一部分知识请结合“单个对象内存管理”去理解)


    这一部分的知识比较简单,就牵扯到一个会产生野指针的情形和如何避免内存泄漏问题。

    代码:

    #import <Foundation/Foundation.h>

    @interface Car : NSObject
    -(void)run;
    @end

    @implementation Car

    //监控Car对象有没有被释放
    - (void)dealloc
    {
        NSLog(@"Car dealloc!");
        [super dealloc];
    }

    -(void)run
    {
        
        NSLog(@"Car run!");
    }
    @end

    @interface Person : NSObject
    {
        Car *_car;
        
    }
    -(void)driver;
    -(void)setCar:(Car *)car;
    @end

    @implementation Person
    - (void)dealloc
    {
        [_car release];//_car 和 car指向的是同一块内存空间,所以说对这两个中任意一个执行释放内存的指令都是可以的。
        NSLog(@"Person dealloc!");
        [super dealloc];
    }
    -(void)driver
    {
        [_car run];
    }
    -(void)setCar:(Car *)car
    {
        [car retain];
        _car=car;
       
    }
    @end

    int main(int argc, const char * argv[]) {
        @autoreleasepool {

            Person *p=[Person new];//p   1
            
            Car *car=[Car new];//car   1
            
            [p setCar:car];//car   2
            //p.car=car;  这样写和上面是一样的~因为写了set方法所以我们可以写点语法
            
            [car release];//此时car释放    1
            
            [p driver];//p调用driver方法,里面会用到car这个实例变量去调用run方法,但是car在之前就已经被释放了,变为了野指针,所以说就会报错,那么应该怎么处理?显然我们可以在释放car之前retain一次,可以在setCar方法中对car对象进行retain,那样当car执行完set方法后计数就变为2。但是这样的话虽然不会报错,可是car的计数又变为了1,如果不进行适当操作,又会出现内存泄漏。所以这个方法只是暂时的。但是这句话目前可以执行不会报错。
            
            [p release];//我们在p的dealloc方法里面加了一个 [car release];  让car的内存释放,这样就不会出现内存泄漏了。此时p计数为0,car计数为0。
            

        }
        return 0;
    }


    ———————————————————————————————————————————

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Struts2-1.配置&与第一个应用
    1.rs.first()、rs.last()、rs.next()、rs.getRow()
    网页跳转
    js---DOM元素节点
    4、BufferedIn(out)putStream--->字节输入/输出流的缓冲区类(高效类:高效率读写)
    3、FileInputStream--->类文件输入流(读取文件数据)
    2、FileOutputStream--->文件输出流(向文件写入数据)
    1、IO输入&输出流 简介
    OutOfMemoryError系列
    Spark调优,性能优化
  • 原文地址:https://www.cnblogs.com/wzy294250051/p/4787884.html
Copyright © 2020-2023  润新知