美文网首页
MRC,自动释放池

MRC,自动释放池

作者: 我不白先生 | 来源:发表于2020-09-18 09:25 被阅读0次

    1.MRC
    1.1淘汰的技术(为了理解自动的即ARC)
    1.1引用计数(RC)是指alloc自动(在对象的堆空间)分配的一块儿存储空间,用于存储持有该空间的指针个数
    1.2.1持有:一个指针指向对象后,并使该对象的RC值加1
    1.2.2指向:仅仅存储对象的地址
    1.3使用retainCount方法查看RC的值
    1.4使用retain方法将RC值加1
    1.5使用release方法将RC值减1后
    1.5.1使用release方法将RC值减1后,RC不为0,release方法直接返回
    1.5.2为0,则先调用dealloc方法,然后释放RC所在的对象的堆空间
    1.6retain做property参数时,可以在setter方法中自动使属性持有所指向的对象,是RC加1。注意:一旦添加,必须在dealloc方法中释放属性


    MRC的设置.png

    TRPoint.h

    @interface TRPoint : NSObject
    @property int x,y;
    -(id)initWithX:(int)x andY:(int)y;
    +(id)pointWithX:(int)x andY:(int)y;
    -(NSString *)description;
    @end
    

    TRPoint.m

    @implementation TRPoint
    -(id)initWithX:(int)x andY:(int)y
    {
        self = [super init];
        if(self)
        {
            self.x = x;
            self.y = y;
        }
        return self;
    }
    +(id)pointWithX:(int)x andY:(int)y
    {
        TRPoint *p = [[TRPoint alloc]initWithX:x andY:y];
        return p;
    }
    -(NSString *)description
    {
        return [NSString stringWithFormat:@"(%d,%d)",self.x,self.y];
    }
    -(void)dealloc
    {
        NSLog(@"点(%d,%d)被释放了",self.x,self.y);
        [super dealloc];//ARC不用写这句
    }
    @end
    

    TRCircle.h

    #import <Foundation/Foundation.h>
    #import "TRPoint.h"
    NS_ASSUME_NONNULL_BEGIN
    
    @interface TRCircle : NSObject
    @property(retain,nonatomic) TRPoint*center;
    @property(nonatomic) double radius;
    @end
    

    TRCircle.m

    @implementation TRCircle
    -(void)dealloc
    {
        [self.center release];
        [super dealloc];
    }
    @end
    

    ViewController.m

    property (weak, nonatomic) IBOutlet UILabel *outputLabel;
    -(void)printRC:(id)obj;
    -(void)method1;
    -(void)method2;
    -(void)method3;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        [self method3];
    }
    -(void)printRC:(id)obj
    {
        self.outputLabel.text = [NSString stringWithFormat:@"%lu",[obj retainCount]];
    }
    -(void)method1
    {
        TRPoint *p = [[TRPoint alloc] initWithX:10 andY:20];
        [self printRC:p];
        [p release];
        NSLog(@"-----------");
    }
    -(void)method2
    {
        TRPoint *p1 = [[TRPoint alloc] initWithX:10 andY:20];
        [self printRC:p1];
        TRPoint *p2 =p1;
        [self printRC:p1];
        [p2 retain];//将p2指向的空间持有,持有是指将其指向的空间的RC值加1
        [self printRC:p1];
        [p2 release];//将p2持有(对象堆)空间的RC值减1
        [self printRC:p1];
        [p1 release];
    }
    -(void)method3
    {
        TRPoint *p = [[TRPoint alloc] initWithX:10 andY:20];
        TRCircle *c = [[TRCircle alloc] init];
        c.center = p;
        //[c.center retain];//在property的参数中添加retain,可以自动实现此句的功能
        [p release];
        //[c.center release];//此句被放在TRCoircle类的的dealloc方法中
        [c release];
    
    }
    @end
    

    2自动释放池
    2.1在ARC中是已经过时技术
    2.2是一个集合,其中有许多对象
    2.3当自动释放池的作用域结束时,池中的所有对象,会被一次性释放
    2.4工厂方法生成的对象,一般会被放入自动释放池

    implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        @autoreleasepool
        {
            {
                //TRPoint *p = [[[TRPoint alloc]initWithX:10 andY:20] autorelease];//MRC的方法
                __autoreleasing TRPoint *p = [[TRPoint alloc]initWithX:10 andY:20];//ARC的方法
            }
            NSLog(@"---------");
        }
    
    }
    @end
    

    2.5自动释放池的嵌套

    相关文章

      网友评论

          本文标题:MRC,自动释放池

          本文链接:https://www.haomeiwen.com/subject/llwlyktx.html