OC语法<2.3>内存管理:ARC机制下的内存管理

一: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方法,并打印出释放对应的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值