ARC,MRC理解

1/*
    oc里面有三种  ARC MRC gc
   java里面有垃圾回收机制
 1. 人工引用计数-MRC(MannulReference Counting)
 2. 自动引用计数-ARC(AutomaticReference Counting)

 在MRC的内存管理模式下,与对变量的管理相关的方法有:retain,release和autorelease。retain和release方法操作的是引用记数,当引用记数为零时,便自动释放内存。并且可以用NSAutoreleasePool对象,对加入自动释放池(autorelease调用)的变量进行管理,当drain时回收内存。
 
 (1)    retain,该方法的作用是将内存数据的所有权附给另一指针变量,引用数加1,即retainCount+= 1;
 
 (2)    release,该方法是释放指针变量对内存数据的所有权,引用数减1,即retainCount-= 1;
 
 (3)    autorelease,该方法是将该对象内存的管理放到autoreleasepool(自动释放池)中。出了“最近的自动释放池”后autorelease会自动减1
 
 
    iOS里面采用引用计数内存,具体有2种内存管理方式, ARC—自动引用计数,MRC—人工引用计数,前者Xcode会帮助管理内存,后者需要开发人员手动去控制应用计数,一块内存区域引用计数一旦变为0,系统会降其删除(标记删除)。
 iOS里面的内存管理关键字有 alloc、retain、release、autorelease、copy,
 其中alloc的作用开辟内存引用从0变为1,
 retain的作用引用计数进行 加1 操作,
 release的作用对内存引用计数立刻进行减1操作,
 autorelease是对内存引用计数在未来的某个时刻进行 减1 操作,
 copy的作用拷贝一个对象到新的内存区域,原来内存区域的引用计数不变,新的区域引用计数由0变为1.
 
    引用计数只针对于堆区
    字符串存在常量区
 
    retain 立刻+1; release 立刻-1; autoreleas 未来某个时刻-1;
    alloc永远只是从0加到1
 
*/
//        Person *p = [[Person alloc]init];
//        // 指针是一个变量,存在于栈区,指针指向的内容Person存在于堆区
//        [p retain];  // 内存引用计数加1
        [p release]; // 内存引用计数减1
        [p release];
//        [p autorelease];
//        [p autorelease];
//        NSLog(@"%lu",p.retainCount);
//        
//        NSString *name1 = [[NSString alloc]initWithString:@"hehe"];
//        NSLog(@"%lu",name1.retainCount);
//        NSString *name2 = @"hehe";
//        NSLog(@"%lu",name2.retainCount);
      上面只创建一个字符串自动放在常量区,下面的创建多个字符串放在堆区
//        NSString *name3 = [[NSString alloc]initWithFormat:@"%@%@",@"woshi",@"daren"];
//        NSLog(@"%lu",name3.retainCount);
        
//        //不是所有的对象都可以使用copy,必须是遵守了NSCopying协议的对象
//        Person *p = [[Person alloc]init];
//        Person *p1 = [p copy];
//        NSLog(@"p = %lu,p1 = %lu",p.retainCount,p1.retainCount);
        
        
/MRC管理内存有一条原则:有加1就要有减1,谁开辟谁释放,谁加1谁减1
//        
//        NSString *test1 = [[NSString alloc]initWithFormat:@"%@",@"gxm"];
//        Person *p = [[Person alloc]init];
//        p.name = test1;
//        //对test进行减一
//        [test1 release];
//        
//        NSString *test2 = [[NSString alloc]initWithFormat:@"%@",@"pangz"];
//        p.name = test2;//set方法
//        test2 = p.name;//get方法
//        [test2 release];
//        NSLog(@"%@",p.name);
//        
//        NSLog(@"%lu",sizeof(test1));
//        NSLog(@"%lu",sizeof([Person class]));
        
/*
        
        @autoreleasepool {  // 自动释放池1
            [test2 release];
        }
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
        test2; // 自动释放池2
        [pool release];
        
*/

//        Person *person1 = [[Person alloc]init];
//        Person *person2 = [[Person alloc]init];
//        NSLog(@"person1=%lu,person2=%lu",person1.retainCount,person2.retainCount);
//        
//        NSArray *array = [NSArray arrayWithObjects:person1,person2,nil];//OC里面所有的集合类会自动对里面的对象进行加1操作,当对象被移除的时候会自动减1
//        NSLog(@"person1=%lu,person2=%lu",person1.retainCount,person2.retainCount);
//        
//        [person1 release];
//        [person2 release];
//        NSLog(@"person1=%lu,person2=%lu",person1.retainCount,person2.retainCount);
//        
//        for (Person *p in array) {
//            NSLog(@"%@",p);
//        }
//        
        //[array release]//凡是便利构造器不需要进行release操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值