OC学习笔记09--OC中内存管理的ARC机制

来源:互联网 发布:win10 python环境搭建 编辑:程序博客网 时间:2024/05/16 15:56
#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]);}@endint 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编译

0 0
原创粉丝点击