Object-C内存管理

来源:互联网 发布:淘宝网秋冬男式上衣 编辑:程序博客网 时间:2024/05/18 00:57

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

tag1.OC本质上还是C语言,所以很多时候还是需要手动去管理内存回收。


Object-C生成一个对象

    Engine *en=[[Engine alloc]init];

    [en dealloc];

1.Object-C对象生成分配空间在堆上,需要使用指针来指向其引用。前面也说到了,Object-C中得对象其实就是C中的指针。

2.+(id) alloc; alloc是一个类方法,调用alloc方法之后会在内存中分配一块空间,并且引用计数会设置为1;

3.+(id) init; 调用init方法表示初始化对象;

4.-(void) dealloc; 这里注意一下dealloc不是一个类方法,而是一个实例方法。dealloc 方法用于销毁对象,当引用计数为0的时候系统会自动调用dealloc方法销毁对象。

小注:

       引用次数:

       1.创建对象时,将它的引用次数设置为 1,每一次必须保持该对象时,就发送一条 retain 消 息 使其引用次数加 1。[myFraction retain];

       2.不再需要对象时,可以通过发送 release 消息,使对象的引用次数减 1。[myFraction release];

       3.当引用计数为 0 的时候,系统就会自动释放它的内存,通过向对象发送 dealloc 消息。通过向对象发送retainCount 消息可以获得这个对象的引用计数,返回的是 NSUInteger 整数。只要对象的引用计数不为 0,系统就不会释放对象使用的内存。


tag2.实例:(内存泄露的产生)

Engine *en=[[Engine alloc] init];
Engine *en2=en;
[en2 retain];
[en print];
[en release];
[en2 print];
[en2 release];

创建对象后,把en对象所在的内存空间赋值给了en2,这时候引用次数为1,执行retain后,引用次数变为2,尽管en执行完函数print后调用了release,次数的引用次数仍然为1,系统不会自动释放内存,导致了en的内存泄露给了en2。此时需要在[en release]后加一条dealloc语句。


tag3.自动回收内存的原理:

采用手动回收内存的方式十分繁琐,并且稍不小心就会引起内存泄露。因此使用autorelease pool(自动释放对象池),在某些情况一下可以不用手工去处理对象内存的释放,但是我们不要完全的依赖与它,这和自动管理内存还是有一定差距的。

Engine *en=[[[Engine alloc] int] autorelease];
Engine *en2=en;
[en2 retain];
[en print];
//[en release];
[en2 print];
[en2 release];

显而易见,en并没有显示调用release方法。



自动回收原理简介

       手工创建自动释放对象池NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  NSAutoreleasePool内部包含一个数组(NSMutableArray),用来保存声明为autorelease的所有对象。如果一个对象声明为autorelease,系统所做的工作就是把这个对象加入到这个数组中去。当NSAutoreleasePool自身释放的时候,会遍历数组中的所有对象,并且调用release方法。如果对象的retainCount=0 那么系统会释放这些对象,如果retainCount>0,则会内存泄露。

  在某些情况下,NSAutoreleasePool 调用的销毁方法比较迟,这个时候会占用大量的内存,我们也可以使用内嵌的方式,创建多个NSAutorelease的实例,让占用的资源立马释放掉。





0 0
原创粉丝点击