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的实例,让占用的资源立马释放掉。
- object c 内存管理
- Object c 内存管理
- object-c 内存管理
- object-c 内存管理
- Object C 内存管理
- Object C 内存管理
- Object-c 内存管理
- OBJECT-C 内存管理
- object-c内存管理
- Object-C内存管理
- Object-C内存管理
- object-c 内存管理
- Object C 内存管理
- Object-C内存管理
- Object-C内存管理
- Object-C内存管理
- Object-C-内存管理
- Object-C内存管理
- File类
- 第二周 项目一-旱冰场造价
- hdoj 4500 小Q系列故事——屌丝的逆袭
- 使用Spring Web Flow-程序流程定义
- HTML5新特性之智能表单: required="required"指示输入字段的值是必需的
- Object-C内存管理
- typedef的用法总结
- LeetCode #3 Longest Substring Without Repeating Characters
- UVA - 11995 I Can Guess the Data Structure! STL模板
- UVA12304直线,圆,点的综合应用
- 学习和使用多种编程语言的感想
- 函数参数的传递问题(一级指针和二级指针)
- 对比
- hibernate缓存机制详细分析