zoukankan      html  css  js  c++  java
  • 关情纸尾-----OC-内存管理

    一、引用计数器

    1.整数,4个字节,表示对象被利用的次数

    2.创建一个新对象时,新对象的引用计数器默认为1

    3.当某个对象的引用计数器为0时,所占内存被系统回收

    4.引用计数器的操作

         retain  +1

         release  -1

         retainCount 获得当前引用计数器值

    5.对象的销毁

    ①引用计数器 0

    ②系统自动发送dealloc给对象

    ③重写dealloc方法

    ④一旦重写了dealloc,就必须调用[super dealloc],放在最后面调用

    ⑤一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致系统崩溃(也就是野指针错误)

    二、野指针和空指针

    1.僵尸对象:对象被回收,僵尸对象不能复活,即不能复活,也就是不能再用 retain 了。如果这个指针还需要用,要么赋新值,要么给个nil

    2.野指针:指向僵尸对象或者不可用内存

    3.空指针:null,nil,0.在oc中不存在空指针错误,系统只会发出警告,不报错

    注:如果给已经释放的对象发送一条消息,可能导致程序闪退

    三、set方法的内存管理

    1.内存管理代码规范

    (1)只要调用了dealloc,必须有release

    (2)set方法的代码规范

    ①基本数据类型:直接复制

    -(void)setAge:(int)age

    {

    _age = age;

    }

    ②oc对象类型

    -(void)setCar:(Car*)car

    {

    if(car!=_car)  //先判断是不是新传递进来的对象

    {

    [_car release]; // 对旧对象做一次release

    _car = [car retain]; //对新对象做一次retain

    }

    }

    2.dealloc方法的代码规范

    (1)一定要[super dealloc],并且放到最后

    (2)对self(当前)所拥有的其他对象做一次release

    -(void)dealloc

    {[_car release];

     [super dealloc];

    }

    四、property的内存管理(代替oc对象的set方法,省略get方法)

    @property(retain)Book*book;

    相当于省略了,

    -(void)setBook:(Book*)book

    {

    if(_book!= book)

    {

    [_book release];

    _book = [book retain];

    }

    }

    五、参数分类

    1.内存管理相关参数

    ①retain:release旧值,retain新值(适用于oc对象类型)

    ②assign:直接赋值(默认适用于非oc对象类型)

    ③copy:release旧值,copy新值

    ④strong:一般对象

    2.是否要生成set方法

    ①readwrite:同时生成setter和getter的声明,实现(默认)

    ②readonly:只会生成getter的声明和实现

    3.多线程管理

    ①nonatomic:性能高

    ②atomic:性能低(默认)

    4.setter和getter方法的名称(自定义)

    setter:决定了set方法的名称,一定要有个冒号

    getter:决定了get方法的名称 

    六、autorelease的基本使用

    1.返回值是id,即对象本身

    2.将对象一个自动释放池,当自动释放池(也是一个对象)被销毁时,会对池中所有对象做一次release操作,但是池子被销毁,对象不一定被销毁

    3.不再用担心僵尸对象

    4.创建的释放池以栈的方式存储,即先进后出

    5.调用完autorelease后,对象的计数器不变

    6.不用关心对象释放时间

    7一般对占用内存较小的对象使用

    七、ARC基本原理

    1.ARC的特点

    ①不允许调用release、retain、retainCount

    ②允许重写dealloc,但是不允许[super dealloc]

    ③@property

    ☆strong:相当于retain(oc对象类型,强指针)

    ☆weak:相当于assign(oc对象类型,弱指针)

    ☆assign:适用于非oc对象类型

    2.ARC的判断准则:只要没有强指针指向对象,就会释放对象

    强指针:系统默认都是。_strong

    弱指针:                   _weak

  • 相关阅读:
    编辑器、编译器、文件、IDE等常见概念辨析
    二叉排序树的实现
    模板
    Codeforces Round #690 (Div. 3)
    Educational Codeforces Round 100 (Rated for Div. 2)
    Codeforces 414-B. Mashmokh and ACM(数位dp)
    Codeforces 339D-Xenia and Bit Operations(线段树)
    Educational Codeforces Round 96 (Rated for Div. 2) 题解
    2019-2020 ICPC Northwestern European Regional Programming Contest (NWERC 2019)
    2018-2019 ICPC Northwestern European Regional Programming Contest (NWERC 2018)
  • 原文地址:https://www.cnblogs.com/Lorraine1/p/4540947.html
Copyright © 2011-2022 走看看