OC中内存管理

//只有对象才会涉及到引用计数的问题,基本数据类型不涉及

    //基本类型声明的属性,成员变量,全局变量等不需要我们手动管理

    //             因为他们存放在栈区,由系统管理(静态的)

    //类的对象(指针)需要我们手动管理内存,因为他们存放在堆区

    //由程序员手动管理(动态的)

    //实例方法:




//strong,weak

//strong--->强引用标志

//weak----->弱引用标志

//1,当属性用strong声明的时候,引用计数加一

//2,当属性用weak声明的时候,引用计数不变(不加一)







-(void)setChuizi:(Weapon*)mchuizi{

//    chuizi=mchuizi;

    //MRC下strong的set方法—————get方法不变-------------

//retain和copy也是这个方法,面试题。。。。。。。。。。。。。。。。。

    if (chuizi!=mchuizi) {

        [chuizi release];

        chuizi=[mchuizi retain];

    }

    

}

//        ClassA*objA=[[ClassA alloc]init];

//        ClassB*objB=[[ClassB alloc]init];

//        

//        NSLog(@"%lu",(unsigned long)[objA.clsb retainCount]);

//        NSLog(@"%lu",(unsigned long)[objB.clsa retainCount]);

//        //将两个对象中的属性赋值,怎么做?

//        objA.clsb=objB;

//        objB.clsa=objA;

//        //重复引用不能够通过编译

//        

//        NSLog(@"%lu",(unsigned long)[objA.clsb retainCount]);

//        NSLog(@"%lu",(unsigned long)[objB.clsa retainCount]);

//        

//        [objA.clsb release];

//        [objB.clsa release];

//        NSLog(@"%lu",(unsigned long)[objA.clsb retainCount]);

//        NSLog(@"%lu",(unsigned long)[objB.clsa retainCount]);

//        

//        

//        //正常开发时没有直接使用retain、release,引入ARC也是这个原因

//        //避免我们手动改变引用计数

//        [objA.clsb release];

        [objB.clsa release];

//        NSLog(@"%lu",(unsigned long)[objA.clsb retainCount]);

//        NSLog(@"%lu",(unsigned long)[objB.clsa retainCount]);

        

        

        

        

        

        

        

        

//ARC(自动引用计数(自动管理内存)),MRC(手动引用计数)

//        alloc表示申请内存。

//        程序中有17836个对象,但是只有一个用到了最后

//        用ARC就会越来越慢,越来越卡

        

//      alloc申请内存

//      dealloc释放内存

        

//        retain表示引用计数器+1

//        release表示引用计数器-1

        

        

        //引用计数

//        oc规定,当某个对象的引用计数器为0时,这个对象会被释放,

//        (自动调用这个【对象的类】的dealloc方法);

        

//        假设:有一个对象,这个对象不能被任何外部方式访问到,也不能被

//             任何方式实例化对象,更不能被调用

//             答:这个对象不存在(这个对象已经被释放了/这个对象的)

//                                             引用计数为0

        

    //内存中常见的三种情况:-------------------------------

        //提前释放:一帮人用火堆烤肉,倒数第二个吃完的人把火熄灭了

        //        最后一人用不了了。

        

        //重复引用:不要反复导入头文件,会造成对象无法释放,

        

        //重复释放(多次释放):已经熄灭的火堆又用水去浇。

        

//程序员在使用、管理内存时的黄金法则:

//谁申请,谁释放。

        

//        在oc中彻底让引用计数归零:1释放内存,2释放指向

//        HERO*hero=[[HERO alloc]init];

//        [hero retain];

//        [hero release];

//        [hero release];

//        hero=nil;

//        NSInteger referenceNumber=[hero retainCount];

//

//        NSLog(@"%lu",referenceNumber);

        

//        Weapon*chui=[[Weapon alloc]init];

//        HERO  *hero=[[HERO alloc]init];

//        

//        hero.chuizi=chui;

//        NSInteger num=[chui retainCount];

//        NSLog(@"%li",(long)num);

//        

//        //chui对象,引用计数为

        

        

        

        

        //NSString唯一一个不受OC引用计数限制的类型

        //NSString不光不遵守引用计数限制,还经常性的不稳定。

//        NSString*str=[[NSString alloc]initWithFormat:@"ha"];

//        

//        NSLog(@"%lu",[str retainCount]);

//        [str retain];

//        NSLog(@"%lu",[str retainCount]);

        

        //1在oc中内存存储本质是通过引用计数确定一个对象是否存储

        //2强弱引用必须要知道————————————————





-(void)setAddress:(NSString *)address{


    if (_address!=address) {

        [_address release];

        //copy-->不管传进来的是可变还是不可变,copy之后的镜像都不可变

        //mutablecopy-->不管传进来的是可变还是不可变,mutablecopy之后的镜像都可变。

        _address=[address copy];

    }

}

ARC的判断标准;只要没有強指针指向这个对象就释放该对象。(程序执行最后)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值