1.什么是内存泄漏
用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,不能被任何程序再次使用,直到程序结束。即所谓内存泄漏。简单的说就是申请了一块内存空间,使用完毕后没有释放掉。
它的一般表现方式是程序运行时间越长,占用内存越多,最终用尽全部内存,整个系统崩溃。由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄露了。
注意:内存泄漏是指堆内存的泄漏。
2.什么是内存溢出
每个设备都有用一定内存,但是程序运行时,iOS给每个应⽤程序提供了⼀定的内存,⽤于程序的运⾏。iPhone 3GS提供内存
30M左右,iPhone 5S 提供内存80M左右。⼀旦超出内存上限,程序就会Crash。
程序中最占内存的就是图⽚、⾳频、视频等资源⽂件。3.5⼨⾮Retina屏幕
(320*480)放⼀张全屏图⽚,占⽤字节数320*480*4(⼀个像素占4个字节,
存放RGBA),即:600k Bytes。iPhone 3GS同时读取60张图⽚就会crash。
4⼨屏幕(320*568),实际像素640*1136,程序存放⼀张全屏图⽚,占⽤字
节数640*1136*4,即2.77M Bytes。iPhone 5S同时读取40张图⽚就会crash。
简单来说,内存溢出就是在程序运行的过程中如果一次需要读取的数据超过这个栈内存大小的话就会出现溢出.所以一般内存管理中,需要生成一个对象释放一个对象,你想对这个对象执行的操作写在生成和释放之间.
野指针
对象内存空间已经被系统回收,仍然使⽤指针操作这块内存。野指针异常是程序crash的主要原因。代码量越⼤的程序,越难找出出现
// 小例子:
// 生成一个Person类的对象 该对象的计数器加1
Person *p = [[Person alloc]initWithName:@"zhangsan" age:14];
// 直接将他释放 该对象的计数器为0
[p release];
// 如果此时再将这个对象显示出来的就会崩溃,因为打印需要有该对象的地址空间指针,但是你已经将其释放了
// 所以该空间的计数器已经置成0了,系统会自动调用dealloc的方法
// 所以这样就会产生野指针异常,所以一般会在你写的类中复写dealloc方法来保证该类的对象的分配空间会被释放掉;
NSLog(@"%@",p);
// 复写的dealloc方法
// 书写规范 一定要写在类的最上面
// 系统自动调用释放对象
- (void)dealloc
{
// 如果重写 dealloc方法必须调用父类的方法,保证对象可以被释放
// 如果你要在dealloc中使用对象的话
// 一定要写在 [super dealloc] 上面
// 避免产生野指针
NSLog(@"哈哈被释放了");
[super dealloc];
}
建议:
内存管理最重要的方式还是:
预防
首先要有良好的编程习惯,生成和释放成对写(手动管理 )
M-OS X系统的电脑是垃圾回收机制,ios现在用的是ARC(自动引用计数)的内存管理模式,以前用的是MRC(手动引用计数),但是记住ARC是继承MRC的,所以学习内存管理得从手动学习.
两种系统提供的调试内存方法:(为野指针的查找提供了便利)
1.CMD + shift + B 这个方法是找到可能存在的内存问题,但是这个方法的准确率不是太高.
2.打开找僵尸对象的调试