OC中有关的内存泄露
来源:互联网 发布:阿姆斯特丹大学 知乎 编辑:程序博客网 时间:2024/06/05 04:50
一.什么是内存泄露
一个对象不再使用,但是这个对象却没有被销毁,空间没有释放,则这个就叫做内存泄露.
二.管理的原则
不再使用的对象必须销毁,释放内存.在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这块空间了,从而会使得他们两者都得到内存的释放.那么这就是循环之间的内存的释放.由于图的原因,可能讲得不是很好,希望大家多多包涵.
可能有一部分我还没有考虑到,在这希望大家能给带你意见,一起交流交流.
1 0
- OC中有关的内存泄露
- 有关java中内存泄露
- OC中内存管理有关
- 有关JAVA的内存泄露
- oc中set方法的不泄露内存写法
- 有关内存泄露检测的一些知识。
- 有关内存泄露
- 有关java内存泄露
- 有关内存泄露
- 转一篇有关Java的内存泄露的文章
- 转一篇有关Java的内存泄露的文章
- 转一篇有关Java的内存泄露的文章
- 转一篇 有关JAVA的内存泄露的文章
- 有关JAVA的内存泄露的文章(转)
- 有关Java的内存泄露的文章(受益哦) .
- 转一篇有关Java的内存泄露的文章
- 转一篇有关JAVA的内存泄露的文章
- AS3.0 一些有关内存泄露的问题
- SpringMVC整合Shiro
- 三种排序方法
- UIViewController的生命周期及iOS程序执行顺序
- Ubuntu-14 sshd 快速安装、配置、使用
- spring是什么
- OC中有关的内存泄露
- hdu 3038(How Many Answers Are Wrong)+3047(Zjnu Stadium)(种类并查集)
- POJ 2528 线段树离散化
- springMVC是什么
- OTG – Android USB Hos
- 使用Charles抓取ios http请求
- 将项目部署到linux步骤小记
- 动态规划问题的一般解决方案
- ORA-01938: 必须为 CREATE USER 指定 IDENTIFIED BY