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

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

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

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



代码:



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

}





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

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

Objective-C 【多个对象内存管理(野指针&内存泄漏)】的更多相关文章

  1. 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配

    垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...

  2. Win3内存管理之私有内存跟共享内存的申请与释放

    Win3内存管理之私有内存跟共享内存的申请与释放 一丶内存简介私有内存申请 通过上一篇文章.我们理解了虚拟内存与物理内存的区别. 那么我们有API事专门申请虚拟内存与物理内存的. 有私有内存跟共享内存 ...

  3. JVM自动内存管理机制——Java内存区域(下)

    一.虚拟机参数配置 在上一篇<Java自动内存管理机制——Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a) ...

  4. C#高级编程9 第14章 内存管理和指针

    C#高级编程9 内存管理和指针 后台内存管理 1) 值数据类型 在处理器的虚拟内存中有一个区域,称为栈,栈存储变量的浅副本数据,通过进入变量的作用域划分区域,通过离开变量的作用域释放. 栈的指针指向栈 ...

  5. Linux中的Buffer Cache和Page Cache echo 3 > /proc/sys/vm/drop_caches Slab内存管理机制 SLUB内存管理机制

    Linux中的Buffer Cache和Page Cache echo 3 > /proc/sys/vm/drop_caches   Slab内存管理机制 SLUB内存管理机制 http://w ...

  6. 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法

    垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...

  7. Rust语言——无虚拟机、无垃圾收集器、无运行时、无空指针/野指针/内存越界/缓冲区溢出/段错误、无数据竞争

    2006年,编程语言工程师Graydon Hoare利用业余时间启动了Rust语言项目.该项目充分借鉴了C/C++/Java/Python等语言的经验,试图在保持良好性能的同时,克服以往编程语言所存在 ...

  8. Objective-C 【单个对象内存管理(野指针&内存泄露)】

    ------------------------------------------- 单个对象内存管理 (1)野指针 ①定义了一个指针变量,但是并没有赋初值,它随机指向一个东西 ②某指针变量指向的内 ...

  9. 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理

    1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...

随机推荐

  1. 解决ArcGIS Engine AE 读取shapefile中文属性乱码的一条偏方

    最近写一个程序,AE+C#,读shp字段属性,其中读到中文就乱码了 这个问题比较奇怪,用AE很多年了,怎么突然就乱码呢,用Arcmap打开,没乱码,证明不是数据问题 网上搜搜,很多人说是许可初始化的问 ...

  2. 通过注册表查看已安装 .NetFramework 版本

    gci "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP" | % {(Get-ItemProperty registry::$_ ...

  3. 使用TopShelf轻松开发Window服务

    关于TopShelf 描述: Topshelf is a framework for hosting services written using the .NET framework. The cr ...

  4. On Memory Leaks in Java and in Android.

    from:http://chaosinmotion.com/blog/?p=696 Just because it's a garbage collected language doesn't mea ...

  5. 【转】Dancing Links精确覆盖问题

    原文链接:http://sqybi.com/works/dlxcn/ (只转载过来一部分,全文请看原文,感觉讲得很好~)正文    精确覆盖问题    解决精确覆盖问题    舞蹈步骤    效率分析 ...

  6. 迷途指针 new delete

    编程中有一种很难发现的错误是迷途指针.迷途指针也叫悬浮指针.失控指针,是党对一个指针进行delete操作后——这样会释放它所指向的内存——并没有把它设置为空时产生的.而后,如果你没有重新赋值就试图再次 ...

  7. IOC(依赖注入)原理

    IoC,直观地讲,就是容器控制程序之间的关系,而非传统实现中,由程序代码直接操控.这也就是所谓"控制反转"的概念所在.控制权由应用代码中转到了外部容器,控制权的转移是所谓反转.Io ...

  8. Redis 安全

      我们可以通过 redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证,这样可以让你的 redis 服务更安全. 实例 我们可以通过以下命令查看是否设置了密码验证: 1 ...

  9. 如何在linux下解压缩rar和zip格式的文件压缩包

    转载:http://oldboy.blog.51cto.com/2561410/597515 使用apt-get安装:  sudo apt-get install  rar  zip rar使用: 将 ...

  10. android开发之路09(浅谈SQLite数据库01)

    1.SQLite数据库: SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. 其特点是高度便携.使 用方便.结构紧凑.高效.可靠. 与其他数据库管理系统不同, ...