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;
}
———————————————————————————————————————————
版权声明:本文为博主原创文章,未经博主允许不得转载。
Objective-C 【多个对象内存管理(野指针&内存泄漏)】的更多相关文章
- 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配
垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...
- Win3内存管理之私有内存跟共享内存的申请与释放
Win3内存管理之私有内存跟共享内存的申请与释放 一丶内存简介私有内存申请 通过上一篇文章.我们理解了虚拟内存与物理内存的区别. 那么我们有API事专门申请虚拟内存与物理内存的. 有私有内存跟共享内存 ...
- JVM自动内存管理机制——Java内存区域(下)
一.虚拟机参数配置 在上一篇<Java自动内存管理机制——Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a) ...
- C#高级编程9 第14章 内存管理和指针
C#高级编程9 内存管理和指针 后台内存管理 1) 值数据类型 在处理器的虚拟内存中有一个区域,称为栈,栈存储变量的浅副本数据,通过进入变量的作用域划分区域,通过离开变量的作用域释放. 栈的指针指向栈 ...
- 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 ...
- 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法
垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...
- Rust语言——无虚拟机、无垃圾收集器、无运行时、无空指针/野指针/内存越界/缓冲区溢出/段错误、无数据竞争
2006年,编程语言工程师Graydon Hoare利用业余时间启动了Rust语言项目.该项目充分借鉴了C/C++/Java/Python等语言的经验,试图在保持良好性能的同时,克服以往编程语言所存在 ...
- Objective-C 【单个对象内存管理(野指针&内存泄露)】
------------------------------------------- 单个对象内存管理 (1)野指针 ①定义了一个指针变量,但是并没有赋初值,它随机指向一个东西 ②某指针变量指向的内 ...
- 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理
1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...
随机推荐
- [置顶] Quartz的DateBuilder详解
DateBuilder类有两个方法: nextGivenMinuteDate和nextGivenSecondDate: Method: (a) public static Date nextG ...
- 【VBA研究】怎样将单元格数据赋给数组
作者:iamlaosong 将工作表中的数据赋给数组或者将数组的数据赋给工作表,一般有两种.一种是循环的方法,一个一个的传,这样的方法一般用于须要对每一个数据特别处理的场合,还有一种是一次性用赋值语句 ...
- 探讨一个新的两个进程间的通信和编程模型 (Windows)
本文探讨一个新的Windows上的两个UI进程间的通信和编程模型. 开门见山,下面是这个通信模型的梗概图: 这个模型的设计目标描述如下: (1)发送数据接口:RpcSend, RpcPost RpcS ...
- Python标准库:迭代器Itertools
Infinite Iterators: Iterator Arguments Results Example count() start, [step] start, start+step, star ...
- iOS 2D绘图详解(Quartz 2D)之概述
前言:最近在研究自定义控件,由于想要彻底的定制控件的视图还是要继承UIView,虽然对CALayer及其子类很熟练,但是对Quartz 2D这个强大的框架仍然概念模棱两可.于是,决定学习下,暂定7篇文 ...
- 15分钟学会git基本的操作命令
http://hao.jobbole.com/try-git/ 假如你现在新创建了一个项目,想把它提交到github上面? 假设你创建好了一个项目,并切换到项目的根目录下面: $ git status ...
- Windows 10正式版官方原版ISO镜像下载
[微软官方]下载地址1:官方下载工具(32-位系统版本)官方下载工具(64-位系统版本) [MSDN]下载地址2:cn_windows_10_multiple_editions_x64_dvd_684 ...
- 项目源码--Android本地音乐播放器
下载源码 技术要点: 1.本地音乐播放与管理 2.支持在线下载 3.非库音频流的解码 4. UI控件的综合使用 5. HTTP通信模块 6. Mysql数据库的综合使用 7. 后台服务技术 8. 源码 ...
- [小技巧]兼容IE6的纯CSS背景半透明文字不透明
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [Java] 集合类(List、Set、Map的基本使用)
数组是一种很常见的数据结构,开始接触编程的时候多数程序都和数组相关.刚开始接触Java时也是一直使用数组写一些程序,后来越来越觉得... 数组是一种很常见的数据结构,开始接触编程的时候多数程序都和数组 ...