美文网首页
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自动释放池的嵌套

相关文章

  • iOS 自动释放池相关

    autoreleasepool自动释放池 自动释放池始于MRC时代,主要是用于 自动 对 释放池内 对象 进行引用...

  • Interview

    Tencent 先简单自我介绍一下自己 对mrc和arc的理解 谈谈对自动释放池的理解 自动释放池在mrc和arc...

  • MRC,自动释放池

    1.MRC1.1淘汰的技术(为了理解自动的即ARC)1.1引用计数(RC)是指alloc自动(在对象的堆空间)分配...

  • Autoreleasepool

    局部释放池 创建一个新的自动释放池的方法:ARC下: 这相当于MRC下: 其中对象s会被加入到自动释放池,当ARC...

  • iOS 面试注意事项

    对mrc和arc的理解:OC知识--彻底理解内存管理(MRC、ARC) - 简书 谈谈对自动释放池的理解:关于自动...

  • 自动释放池

    MRC想要将对象放进autoreleasepool中,必须显示调用autorelease 自动释放池Autorel...

  • MRC下的自动释放池

    @autoreleasepool { //autorelease会返回对象本身 //autorelease会将对象...

  • OC内存管理

    Objective-C提供三种内存管理模型: 自动垃圾回收 手动引用计数MRC和自动释放池. 自动引用计数ARC....

  • 自动释放池-看大牛解释

    iOS---自动释放池在 mrc 的代码中,没有 weak,只有 assignassign 修饰符号,对对象不做任...

  • iOS Runtime 数据结构

    ios内存布局 内存管理方案 数据结构 ARC & MRC 引用计数 弱引用 自动释放池 循环引用 ios内存布...

网友评论

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

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