适合有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编译
|
|