oc中的内存管理机制
来源:互联网 发布:waphyseccom软件下载 编辑:程序博客网 时间:2024/06/07 06:51
1基本原理
对于存在指针赋值的情况,代码与前面类似。 ClassA *class1 = [[[ClassA alloc] init] autorelease];//retain count = 1 ClassA *class2 = class1;//retain count = 1; [class2 retain];//retain count = 2 [class1 hello];//输出hello //对于 class1,无需调用(实际上不能调用)release [class2 hello];//输出hello [class2 release];//retain count = 2 - 1 = 1
oc的内存管理机制与.Net/java那种全自动的垃圾回收机制是不同的,它本质上还是C语言的手动管理方式,只不过稍微加了些自动方法。
1、 Objective-c的对象生成之后,需要一个指针来指向它。
ClassA *class1 = [[ClassA alloc] init];
2、oc的对象在使用完成之后不会自动销毁,需要执行dealloc来释放空间(销毁),否则内存泄露。
[self dealloc];
这带来一个问题,下面代码中class2是否需要调用dealloc?
ClassA *class1 = [[ClassA alloc] init];
ClassA *class2 = class1;
[class1 hello];//输出hello
[class1 dealloc];
[class2 hello];
[class2 dealloc];
3、oc采用了引用计数(refcount或者retaincount).对象的内部保存一个数字,表示被引用的次数。例如,某个对象被两个指针所指向(引用)那么它的retain count为2.需要销毁对象的时候,不直接调用dealloc,而是调用release.release会让retain count减一,只有 retain count等于0,系统才会调用dealloc真正销毁这个对象。
ClassA *class1 = [[ClassA alloc] init];//对象生成时,retain count = 1;
[class1 release];//release使retain count减1,retain count = 0,dealloc自动被调用,对象被销毁
我们回头看看刚刚那个无效指针的问题,把dealloc改成release解决了吗?
ClassA *class1 = [[ClassA alloc] init];//retain count = 1
ClassA *class2 = class1;//retain count = 1
[class1 hello];//输入hello
[class1 release];//retain count = 0,对象被销毁
[class2 hello];
[class2 release];
[class1 release]之后,class2依然是个无效指针。问题依然没有解决。
4.oc指针赋值时,retain count 不会自动增加, 需要手动 retain.
ClassA *class1 = [[ClassA alloc] init];//retain count = 1;
ClassA *class2 = class1;//retain count = 1;
[class2 retain];//retain count = 2
[class1 hello];// 输出hello
[class1 release];//retain count = 2 - 1 = 1
[class2 hello];输出hello
[class2 release];retain count = 0,对象被销毁
问题解决!注意,如果没有调用[class2 release],这个对象的retaincount 始终为1,不会被销毁,内存泄露。
这样的确不会内存泄露,但似乎有点麻烦,有没有简单点的方法?
5、oc中引入了autorelease pool(自动释放对象池),在遵守一些规则的情况下,可以自动释放对象。
新生成的对象,只要调用autorelease就行了,无需调用release!
0 0
- oc中的内存管理机制
- OC中的内存管理机制
- IOS第四节:OC中的内存管理机制
- Oc-内存管理机制
- 浅谈OC内存管理机制
- OC中内存管理机制
- OC内存管理机制
- <center>oc内存管理机制<:center>
- OC:OC内存管理机制(上)
- Python中的内存管理机制
- Android中的内存管理机制
- ios中的内存管理机制
- iOS中的内存管理机制
- cocos2dx中的内存管理机制
- Android中的内存管理机制
- Android中的内存管理机制
- Android中的内存管理机制
- OC 内存引用计数 内存管理机制
- ubuntu安装运行mongodb
- c/c++基础(二十七) Linux下core文件调试方法
- uva—How do you add?
- 在JAVA中利用SOCKET创建一个用于收发报文的长连接服务器
- easyUI datagrid 前端假分页
- oc中的内存管理机制
- Java字符编码根本原理
- Andriod 适配器使用事例
- Perl中列用工具List模块
- 蓝牙模块如何进入AT模式
- mac下 安装python包numpy, nltk
- Octave 3.6.4在Window 7下设置“安装”
- 数据结构实验之二叉树的建立与遍历
- win7+putty+USB2.0转RS232