一.什么是内存泄露
一个对象不再使用,但是这个对象却没有被销毁,空间没有释放,则这个就叫做内存泄露.
二.管理的原则
不再使用的对象必须销毁,释放内存.在Xcode5.0以前需要程序员手动释放内存,那样的工作量太大,而且还要对堆区的是如何的工作了如指掌,那样的工作效率不是很高.那么到了Xcode5.0之后我们没有必要担心,可以直接对程序的功能加强,这样能使得效率更高.那么Xcode5.0之前到底是怎么运作的呢?我们先来看看代码吧.
Person *per = [[Person alloc]init];
Computer *computer = [[Computer alloc] init];
那么我想先说说Xcode5.0之前程序员是如何释放的.首先,在内存当中计数器起到了加1或者减1的作用.上面这段代码就是在创建对象的时候计数器就由0加到1了.然后就是下面的代码了,也能使得计数器加或者减.
//[computer retain];//计数器加1
//[counter release];//计数器减1
然后当每次遇到release的时候减1.并且调用下面这段代码.
-(void)dealloc{
代码块;
}
当然最后当遇到下面这段程序的时候会完全释放.
@autoreleasepool {
代码块;
}
上面这种内存泄露是Xcode5.0版本的时候手动做的事,那么在Xcode5.0之后就不需要程序员手动释放了,此时,Xcode会帮我们直接搞定这些事情.那么接下来我就告诉你们一个很好的办法,就算是我们自己手动管理也不怕了.我也称之为"搞定内存泄露三字经".
//谁引用,谁retain.
//谁引用,谁release.
//谁retain,谁release.
是不是很容易就听懂啊,只要记住这三点,搞定一般的问题是没问题的.
三.解决循环引用中产生的内存泄露的问题.
老规矩,什么是循环内存泄露呢?说的同通俗点就是一个对象中有定义了另外一个对象的指针,而且他们之间存在相互指向,当强指针和弱指针发挥作用的时候就会造成内存的泄露.这是我所理解的.那么到底弱指针和强指针到底是什么呢?
//__strong;强指针
//__weak;弱指针
这来个两个就是强指针和弱指针的表示方式.只有当两个对象之间有强和弱不同的指针的时候,才会使得内存的到释放.我们直接来看代码吧.
#import <Foundation/Foundation.h>
@class Computer;//引用
@interface Person : NSObject
@property int age;//定义年龄
@property (nonatomic,weak) Computer *cp;
@end
这是定义了一个Person的头文件.
#import <Foundation/Foundation.h>
#import "Computer.h"
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建对象per
__strong Person *per = [[Person alloc]init];
//创建对象computer
__strong Computer *computer = [[Computer alloc] init];
per.cp = computer;//赋值
computer.per = per;//赋值
}
return 0;
}
然后就是面最终要的一部分了,main函数.
//高性能,强引用,定义set/get方法
@property(nonatomic,strong) Person *per;
然后就是只有当两个函数中分别存在不同的强指针和弱指针,才会发挥他们的作用.那么我们来看看这段代码在内存是怎么指向的吧.由于上传不了图片,俺么这里我就用文字给大家描述吧.
Person对象
Computer指针 <---------------- *per
*cp
*cp 指向*per
*per指向*cp这两块有相反的箭头
Computer对象
Person指针 <-------------------*computer
*per
由于当程序执行到了return 0上面的花括号,那么会使得*per和*computer释放,那么就会使得,指向两者的箭头消失,也就是*per和*computer释放了.但是由于Person和Computer两者存在相互的指向,那么由于强弱指针的作用,当弱指针的时候会值得指向Computer的这个对象释放,拿么,就剩下Person一个有强指针指向的对象了,那么,由于Computer也释放了,由于强指针自己的本质使得没有对象指向Person这块空间了,从而会使得他们两者都得到内存的释放.那么这就是循环之间的内存的释放.由于图的原因,可能讲得不是很好,希望大家多多包涵.
可能有一部分我还没有考虑到,在这希望大家能给带你意见,一起交流交流.