首页 技术 正文
技术 2022年11月14日
0 收藏 307 点赞 2,939 浏览 1341 个字

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

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

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

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

代码:

#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;

}

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

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

下一篇: redi安装
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,493
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295