一:ARC机制的工作原理
本节知识点:
1:ARC机制不用管理员去管理内存,Strong 强指针,Weak 弱指针
2:ARC机制的本质
1>只要有强指针指向一个对象,那么系统就不会回收该对象
2>如果没有强指针指向一个对象,那么系统就会马上 回收该对象
3>弱指针不影响对象回收
4>默认情况下所有的指针都是强指针类型
我们在ARC机制下创建一个Person对象,(现在的xcode版本默认的都是ARC机制)#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc]init];
//p = nil;
Person *p1 = p;
p = nil;
}//当对象走出作用域的时候,系统会回收该对象,也就是说没有强指针指向他了
__weak Person *p2 = [[Person alloc]init];//弱指针不影响对象被回收,走完这一步马上被回收
return 0;
}
Person的.m文件
#import "Person.h"
@implementation Person
-(void)dealloc
{
//[super dealloc];在ARC机制下不能够再掉用了
//release,retain 再ARC机制下不能够再去手动调用
NSLog(@"Person被释放了");
}
@end
二:ARC机制下的@property参数
本节知识点:
在ARC机制下 尽量不要再用retain 和 assign 关键字,当然常量的时候还是可以用assign,要用strong 代替retain,weak代替assign
详细代码示例如下:
#import <Foundation/Foundation.h>
#import "Car.h"
@interface Person : NSObject
//@property (nonatomic,retain)Car *car;手动内存管理中这么写
//ARC机制中 Strong 对应手动内存管理的retain关键字。(一定都是应用在对象类型上);
//ARC机制中 weak 对应手动内存管理的 assign关键字。(一定都是应用在对象类型上);
@property(nonatomic,strong)Car *car;
@property(nonatomic,weak)Car *car2;//弱指针类型的对象,不会影响对象的回收
//再ARC机制下,基本数据类型的@property参数的使用和手动内存管理完全一致
@property(nonatomic,assign)int age;
@end
三:手动内存管理转换成ARC机制管理
就是说你本来的代码是
手动内存管理形式的现在想把它变成ARC机制,操作如下图:
四:ARC与非ARC共存
我们现在常遇到这种情况,就是说我们想用一个第三方插件,但是第三方是用手动内存管理机制写的,那么我们怎样才能够让他们共存而不报错呢?
按照下图的顺序,找到你的手动内存管理的.m文件双击加上下面几句就ok了
五:ARC类的循环引用问题
这里我们就会用到weak关键字,就是说当我们创建两个类,两个类相互调用,你调用我,我调用你,那么编译的时候肯定会报错,对象的内存不会释放,所以就需要用下weak关键字,让“他们”分下高低,我们创建一个Person对象,创建一个Car对象 代码示例如下:
main 函数
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Car.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *pes = [[Person alloc]init];
Car *car = [[Car alloc]init];
[pes setCar:car];
[car setPer:pes];
pes = nil;
car = nil;
NSLog(@"11343235");
}
return 0;
}
Car 的 .h文件
#import <Foundation/Foundation.h>
//#import "Person.h" 遇到这种情况的时候一般就是你导入的包没有识别,改成@class导入就可以了 Unknown type name 'Person'
@class Person;
@interface Car : NSObject
//@property(nonatomic,strong)Person* per;
//当类循环引用的时候,只需要把一方面的Strong 引用改为:weak,并且在 .h 文件中使用@class 类名的方式通知.h类的存在
@property(nonatomic,weak)Person* per;
@end
Person的.h文件
#import <Foundation/Foundation.h>
#import "Car.h"
@interface Person : NSObject
@property(nonatomic,strong)Car* car;
//@property(nonatomic,weak)Car* car;
@end
两个对象的.m文件中 都是重写了dealloc方法,并打印出释放对应的对象