黑马程序员技术交流社区
标题:
OC学习笔记09--OC中内存管理ARC机制
[打印本页]
作者:
wowthe1st
时间:
2015-8-3 14:07
标题:
OC学习笔记09--OC中内存管理ARC机制
适合有java与C基础同学迅速了解OC
#import <Foundation/Foundation.h>
@class ClassB;
//ClassA
@interface ClassA :NSObjcet
//ARC机制下,retain参数不可用,改成strong
@property (nonatomic,strong) ClassB b;
//非OC对象仍然使用assign
@property (nonatomic,assign) int count;
@end
@implementation ClassA
- (void)dealloc
{
NSLog(@"%@ deallocated",[self className]);
//dealloc中无法调用[super dealloc]
}
@end
//ClassB
@interface ClassB :NSObject
// 一方使用弱引用解决循环retain的问题
@property (nonatomic,weak) ClassA a;
@end
@implementation ClassB
- (void)dealloc
{
NSLog(@"%@ deallocated",[self className]);
}
@end
int main()
{
//ARC机制下无法使用任何内存管理相关方法与对象
ClassA *a=[[ClassA alloc] init];
ClassB *b=[[ClassB alloc] init];
[a setB:b];[b setA:a];
return 0;
}
复制代码
OC中ARC机制:
ARC为编译器特性,不同于java中GC为运行时特性;
ARC回收对象的原则:
无强指针指向对象,则release;
强指针
:__strong TYPE *p 为强指针,默认声明的所有指针都是强指针
弱指针
:__weak Type *p 为弱指针,弱指针在指向的对象被销毁后会自动置零
使用ARC与不用代码上的区别:
1>ARC机制下,代码中无法使用任何内存管理相关的方法(retain,release,autorelease 等)
及对象(NSAutoreleasePooll 等),但是并非程序不使用内存管理功能,而是
内存管理代码由compiler在compile期间自动添加,无需开发人员参与内存管理;
2>ARC机制下,对象的setter无法使用retain,即@property中无法使用retain参数,
改用strong与weak表示强引用或是弱引用(适用OC对象,其他数据类型仍然使用assign)
例:@property (nonatomic,strong) NSObject * obj;
ARC机制下循环retain问题解决方式:一方使用strong,另一方使用weak
3>ARC机制下,重写的dealloc方法中无法再调用[super dealloc];
项目中部分文件使用ARC,部分不使用情况,可以给项目文件设置如下参数,告诉编译器是否使用ARC机制进编译:
-fno-objc-arc
不使用ARC编译
-f-objc-arc
使用ARC编译
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2