OC-028.ARC自动内存管理的自动释放池

ARC automatic Reference Counting 自动引用计数

ARC的自动释放池进行内存的管理比MRC要简单许多,编译器会帮程序员在适当的时候自动添加内存的管理代码。


那么ARC中是通过什么来确认对象是否需要释放?

ARC中是判断对象是否被强指针指向,来进行判断的。

*******也有例外,在ARC中也有自动释放池,什么时候使用呢?*********
*******只要是通过简洁的构造方法,或者是普通方法返回的对象都放在自动释放池中:比如类方法*****

#import <Foundation/Foundation.h>//------main
#import "LSCat.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        {                               //只要是通过简洁的构造方法,或者是普通方法返回的对象都放在自动释放池中
            LSCat *cat = [LSCat catInit];
        }                               //这行cat指针被释放了,但是对象是被放入自动释放池中了
            }
    return 0;
}
#import <Foundation/Foundation.h>//------LSCat.h

@interface LSCat : NSObject
+(instancetype) catInit;
@end
#import "LSCat.h"//------LSCat.m

@implementation LSCat
+(instancetype) catInit{
    return [[self alloc] init]; //在这后面加了个autorelease
}
-(void)dealloc{
    NSLog(@"%s",__func__);
}

@end


1.强指针:默认所有的指针都是强指针
只要是有强指针指向一个对象,那么这个对象就不会被释放
只要是没有强指针指向一个对象,那么这个对象就被立即回收
__strong 强指针标示,默认所有指针都是强指针(基本不写)


2.弱指针:弱指针指向的对象不影响对象回收
__weak关键字
注意:不要用弱指针指向一个刚刚创建出来的对象,对象会被立即释放。



当出现循环引用的时候,有一端必须是弱指针

<span style="font-size:12px;">#import <Foundation/Foundation.h>//--------main
#import "LSPerson.h"
void test(){
    @autoreleasepool {
        {
            LSPerson *per = [[LSPerson alloc] init]; //什么时候释放看对象有没有被强指针指着
        }
        LSPerson *per2 = [[LSPerson alloc] init];
        per2 = nil;//当指针被清空的时候,这个对象就被释放了
    }

}
void test2(){
    @autoreleasepool {
        LSPerson *per = [[LSPerson alloc] init];
        {
            LSCar *car = [[LSCar alloc] init];
            per.car = car;
        }  //这行car不会被释放,因为per.car这个强指针还是指向car的
        
    }//在这行per被释放了,所以car也被释放了

}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        LSPerson *per = [[LSPerson alloc] init];
        LSCar *car = [[LSCar alloc] init];
        per.car = car;
        car.person = per;   //当循环引用的时候,某一环必须是弱引用__weak,否则内存泄露
//        __weak LSPerson *per2 = [[LSPerson alloc] init];不要创建的时候用弱指针,对象会直接释放
//        NSLog(@"%p",per2);指针指向的是nil
        NSLog(@"%p",car.person);//虽然car里面的person是弱指针,但是这个person被per指着,所以不会被释放
    }
    
    return 0;
}
</span>
#import <Foundation/Foundation.h>//--------LSPerson.h
#import "LSCar.h"
@interface LSPerson : NSObject
{
     LSCar *_car;  
}
-(void) setCar:(LSCar *)car;
@end
#import "LSPerson.h"//------LSPerson.m

@implementation LSPerson
-(void) setCar:(LSCar *)car{
    _car = car;
}

-(void)dealloc{
    NSLog(@"%s",__func__);
}
@end
#import <Foundation/Foundation.h>//------LSCar.h
@class LSPerson;
@interface LSCar : NSObject
{
    __weak LSPerson *_persom;//如果这边不加__weak那么内存不会被回收,到底哪一方需要用弱指针,就看那个对象在控制别人的生命周期
}
-(void) setPerson:(LSPerson *)person;
-(LSPerson *)person;
@end
#import "LSCar.h"//------LSCar.m
#import "LSPerson.h"
@implementation LSCar
-(void) setPerson:(LSPerson *)person{
    _persom = person;
}
-(LSPerson *)person{
    return _persom;
}
-(void)dealloc{
    NSLog(@"%s",__func__);
}

@end








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值