ARC 总结
来源:互联网 发布:腾讯游戏礼包领取软件 编辑:程序博客网 时间:2024/06/05 13:30
在MRC的内存管理模式下,与对变量的管理相关的方法有:retain,release和autorelease。retain和release方法操作的是引用记数,当引用记数为零时,便自动释放内存。并且可以用NSAutoreleasePool对象,对加入自动释放池(autorelease调用)的变量进行管理,当drain时回收内存。
(1) retain,该方法的作用是将内存数据的所有权附给另一指针变量,引用数加1,即retainCount+= 1;
(2) release,该方法是释放指针变量对内存数据的所有权,引用数减1,即retainCount-= 1;
(3) autorelease,该方法是将该对象内存的管理放到autoreleasepool中。
示例代码:
//假设Number为预定义的类
Number* num = [[Number alloc] init];
Number* num2 = [num retain];//此时引用记数+1,现为2
[num2 release]; //num2 释放对内存数据的所有权 引用记数-1,现为1;
[num release];//num释放对内存数据的所有权 引用记数-1,现为0;
[num add:1 and 2];//bug,此时内存已释放。
ARC是编译器(时)特性,而不是运行时特性,更不是垃圾回收器(GC),编译时插入相应的retian release。
1.ARC帮我们添加或是减少引用计数,并不是简单的发消息机制-retain、release,而是调用底层的objc_retain、objc_release.
2.使用ARC必须遵循方法命名规则, -alloc -new -copy -mutabelCopy 以这些单词开头的函数返回的对象归调用者所有,也就是其内存归调用者管理了,若不是这些单词开头的不归调用者所有,可能在当前线程执行下次runloop event 前回收【没有被@autoreleasepool{}包着】
3.ARC不仅可以像第一条那样管理引用技术,而且还可以优化掉一些可优化的加减引用计数。
例如, +(SomeObj) theObj { return [[SomeObj alloc ] init] ; //返回的对象其实是autorelease的}
_someObjInstance = [SomeObj theObj];
若非ARC应该这么写 SomeObj * temp = [SomeObj alloc ] init] ;
[temp autorelease];
SomeObj * temp = [SomeObj theObj];
[temp retain];
ARC会在运行期检测这一对多余操作,进行优化,检测autorelease后有retain不执行autorelease,设置全局数据结构中的一个标志位,相应的retain前检测那个标志位,相应地也不执行retain操作了。
4.使用ARC不用考虑一些边界情况。 非ARC下这样写的话。
-(void)setObject:(id)obj {
[_object release];
_object = [obj retain];
}
这种情况下如果新值旧值相同那么,这个值先减一后会使计数变为0,接下来执行保留操作会使程序崩溃,ARC会用一种安全的方式,先保留新值再释放旧值,无需考虑这种情况了。
-(void)setObject:(id)obj {
[obj retain];
[_object release];
_object =obj;
}
5.ARC会自动生成回收对象所执行的代码,通常无需在编写dealloc方法,但是coreFondation或是由malloc分配在堆中的内存扔需要清理。
1 0
- ARC(七):ARC总结
- ARC总结
- ARC总结
- ARC总结
- ARC总结
- ARC总结
- ARC 总结
- ARC总结
- ARC 学习总结
- iOS ARC Property 总结
- iOS ARC使用总结
- iOS arc总结
- ARC使用总结
- 【ios】(ARC) 使用ARC的注意事项总结
- 内存管理总结-ARC和非ARC
- ARC的使用简要总结
- ARC内存管理原则总结
- OC中的ARC机制总结
- CodeForces 368A
- 如何学好FPGA
- Markdown编辑技巧记录
- 运算符之间的用法与比较
- php 变量值比较注意事项
- ARC 总结
- 24位二进制解析为有符号整数
- CodeForces 366A
- 设计模式(四)
- VC++中编译C出错:error C2143: syntax error : missing ';' before 'type'
- 安装Windows补丁KB947821报错0x8007000d The data is invalid
- UI_01.第一个ios UI
- 多线程模拟实现生产者/消费者模型
- Spark学习之编程进阶——累加器与广播(5)