zoukankan      html  css  js  c++  java
  • 内存(MRC)

    一、计数器的基本操作
    1> retain : +1,
     方法返回的是对象本身
    2> release :-1
    3> retainCount : 获得计数器
    4> dealloc
      * 当一个对象要被回收的时候,就会调用
      * 一定要调用[super dealloc],这句调用要放在最后面

     
     2.概念
     1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用(有时会崩溃
     2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
     3> 空指针 :没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错(
     OC不存在空指针错误,给空指针发送消息,不报错


    1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作)

     2.你不想再使用(占用)某个对象,就应该让对象的计数器-1(让对象做一次release)

     3.谁retain,谁release
     
     4.谁alloc,谁release
     
    尽量少使用类方法创建对象,因为此时是autorelease,于用户交互时自动释放

     二、set方法的内存管理
    1> set方法的实现
    - (void)setCar:(Car *)car
    {
        if ( _car != car )
        {
            [_car release];
            _car = [car retain];
        }
    }

    2> dealloc方法的实现(不要直接调用dealloc)
    - (void)dealloc
    {
    //绝对安全:
          self.name = nil;
         self.car = nil;
        [super dealloc];
    }

    三、@property参数
    1> OC对象类型
    @property (nonatomic, retain) 类名 *属性名;
    @property (nonatomic, retain) Car *car;
    @property (nonatomic, retain) id car;

    // 被retain过的属性,必须在dealloc方法中release属性
    - (void)dealloc
    {
        self.car = nil;(注意:该语句等同于release原来的对象,然后对nil进行retain,对nil的任何操作没有作用)
        [super dealloc];
    }

    2> 非OC对象类型(intfloatenumstruct)
    @property (nonatomic, assign) 类型名称 属性名;
    @property (nonatomic, assign) int age;

    四、autorelease
    1.系统自带的方法中,如果不包含alloc、new、copy,那么这些方法返回的对象都是已经autorelease过的
    [NSString stringWithFormat:....];
    [NSDate date];

    2.开发中经常写一些类方法快速创建一个autorelease的对象
    * 创建对象的时候不要直接使用类名,用self

    init的重写,即自定义构造赋值时应用self.car(注意,为点语法,set或get方法)才能保正绝对安全。
    内存管理代码规范:
     1.只要调用了alloc,必须有release(autorelease)
       对象不是通过alloc产生的,就不需要release
     
     2.set方法的代码规范
     1> 
    基本数据类型:直接复制

     - (void)setAge:(int)age
     { 
        _age = age;
     }
     
     2> OC对象类型
     - (void)setCar:(Car *)car
     {
        // 1.先判断是不是新传进来对象
        if ( car != _car )
        {
            // 2.对旧对象做一次release
            [_car release];
     
            // 3.对新对象做一次retain
            _car = [car retain];
        }
     }
     
     3.dealloc方法的代码规范
     1> 一定要[super dealloc],而且放到最后面
     2> 对self(当前)所拥有的其他对象做一次release

     - (void)dealloc
     {
        self.car = nil;
        [super dealloc];
     }
    conllection内存的管理:

    collection就是NSArray,NSDictionary,NSSet...等容器类,会自主管理自己内部的元素。

    加⼊入collection中的对象会被retain 
    移除出collection的对象会被release 
    collection被释放会对内部所有对象release 

    copy浅拷贝(copy),retain+1,多1指针指向该内存,数组、字典元素为浅拷贝
    copy深拷贝(mutablecopy),retain不变,开辟一块新内存,retain由0到1.数组与字典其中的元素仍为浅拷贝
     
    NSString *str = [[NSString alloc]init];
    //可变、不可变字符串或数组、字典mutablecopy均为可变字符串
    或数组、字典
            NSMutableString *str1 = [str mutableCopy];
            NSLog(@"%p,%p",str,str1);
            
            NSMutableString *str2 = [[NSString alloc]init];
            
            //可变、不可变字符串
    或数组、字典copy均为不可变字符串或数组、字典
            NSString *str3 = [str copy];
            NSLog(@"%p,%p"
    ,str2,str3);
     
  • 相关阅读:
    03 类与对象
    课堂作业02程序设计
    动手动脑
    做课题时的一些问题
    课题一
    《大道至简》JAVA伪代码读后感
    题目-兔子繁衍问题
    题目-求一个日期是该年中的第几天
    题目-查验身份证
    题目-删除重复字符
  • 原文地址:https://www.cnblogs.com/Alling/p/3971897.html
Copyright © 2011-2022 走看看