首页 > 代码库 > 内存管理初级基础

内存管理初级基础

内存管理方式

  • 垃圾回收机制(gc)(java在特定时间段进行回收);

  • MRC(Manual Reference Count)(手动管理)苹果中没有垃圾回收机制。。。。。。

  • ARC(Auto Reference Count)     (自动引用计数)

---->垃圾回收:程序员只需要开辟内存空间,不需要用代码显示地释放,系统类判断哪些空间不再被使用,并回收这些内存空间,以便再次分配。整个回收过程不需要写任何代码,由系统自动完成垃圾回收。java开发中一直使用到就是垃圾回技术。

引用计数机制,影响计数的各个方法

MRC(Manual Reference Count)---->人工引用计数:内存的开辟和释放都由程序代码进行控制

ARC(Auto Reference Count)----->自动引用计数:IOS 5.0的编译器特性,它允许用户开辟空间,不用去释放空间。它不是垃圾回收!他的本质还是MRC,只是编译器帮程序员默认加类释放的代码;

IOS的内存管理

  • IOS支持两种内存管理方式:ARC和MRC

  • MRC的内存管理机制是:引用计数

  • ARC是基于MRC 

影响内存引用计数的方法

  • alloc:开辟内存空间,引用计数从0到1的过程

  • retain:引用计数加1

  • release:引用计数减1

  • autorelease:自动释放,使引用计数减1,但必须是放到autoreleasepool里面

  • copy:引用计数加1,如果使用copy,需要接受NSCopying协议,同时实现。

  • copyWithZone:方法

  • dealloc方法:当引用计数从1到0时,系统会自动调用dealloc方法。。。

dealloc 

  • -dealloc是继承自父类的方法,当对象引用计数为0的时候,由对象自动调用。

  •  我们可以在dealloc中打印一句话,验证对象引用计数是否降为0.

  • - (void)dealloc{ 

  • NSLog(@“%@被销毁了”,self);

  •  [super dealloc];

autoreleasepool 的使用

  • NSAutoreleasePool *pool= [[NSAutoreleasePool alloc]init];

  • Person *p = [[Person alloc]init];      //retainCount1

  • [p retain];       //retainCount2

  • [p autorelease];       //retainCount未来的某个时刻释放 

  • [pool release];

  • NSLog(@%d,[p retainCount]);    //打印结果为1


  • NSAutoreleasePool *pool= [[NSAutoreleasePool alloc]init];[pool release];就像一对括号,[xxx autorelease];必须写在两者 间。

  • [xxx autorelease];出现在了两者之间,pool就会把接收 autorelease的对象给保存起来(以栈的方式,把对象压入栈)

  • [pool release];的时候,pool会向之前保存的对象逐一发送 release消息(对象出栈,越晚autorelease的对象,越早接收 release消息)。


  • iOS5之后,不再推荐使用NSAutoreleasePool类,使@autoreleasepool{}替代。

  • 之前写在NSAutoreleasePool *pool= [[NSAutoreleasePool alloc]init];[pool release];之间的代码,需要写在 @autoreleasepool{}的大括号里。

  • 出了大括号,自动释放池才向各个对象发送release消息。

内存管理原则


  • 引用计数的增加和减少相等,当引用计数降为0之后,不应该再使 用这块内存空间。

  • 凡是使用了allocretain或者copy让内存的引用计数增加了,就需 要使用release或者autorelease让内存的引用计数减少。在一段代码内,增加和减少的次数要相等。


copy方法


  • -retain不同,一个对象想要copy,生成自己的副本,需要实现 NSCopying协议,定义copy的细节(如何copy)。如果类没有接 受NSCopying协议而给对象发送copy消息,会引起crash


copy方法实现

  • Person.h文件

  • @interface Person : NSObject<NSCopying> 

  • @property(nonatomic, retain)NSString *name; 

  • @property(nonatomic, assign)int age;

  • @end 

  • 不是任何对象都可以接收copy消息,只有接受了NSCopying协议的对象 才能接收copy消息 

  • Person.m文件

  • @implementation Person

  • - (id)copyWithZone:(NSZone *)zone

  • {

  • Person *p = [[Person allocWithZone:zone]init];

  •  p.age = self.age;

  • p.name = self.name;

  • return p;



  • main.m文件

  • Person *p = [[Person alloc]init];

  • p.name = @张三;

  • p.age = 20;

  • Person *p2 = [p copy]; p2p的副本。p2.namep.name一样。p2.agep.age一样。


本文出自 “小刘_Blog” 博客,请务必保留此出处http://liuyafang.blog.51cto.com/8837978/1544847

内存管理初级基础