• iOS基础 ----- 内存管理


      Objective-C 的内存管理方式有引用计数机制,垃圾回收机制,自动释放池。有alloc,就有释放。iOS应⽤程序出现Crash(闪退),90%的原因是因为内存问 题。在⼀个拥有数⼗个甚⾄是上百个类的⼯程⾥,查找内存问 题极其困难,学会内存管理,能帮我们减少出错的⼏率。内存问题体现在两个⽅⾯:内存溢出、野指针异常。

    引用计数器

      在Xcode4.2及之后的版本中由于引入了ARC(Automatic Reference Counting)机制,程序编译时Xcode可以自动给你的代码添加内存释放代码,如果编写手动释放代码Xcode会报错,因此在今天的内容中如果你使用的是Xcode4.2之后的版本(相信现在大部分朋友用的版本都比这个要高),必须手动关闭ARC,这样才有助于你理解ObjC的内存回收机制。ObjC中的内存管理机制跟C语言中指针的内容是同样重要的,要开发一个程序并不难,但是优秀的程序则更测重于内存管理,它们往往占用内存更少,运行更加流畅。虽然在新版Xcode引入了ARC,但是很多时候它并不能完全解决你的问题。在Xcode中关闭ARC:项目属性—Build Settings--搜索“garbage”找到Objective-C Automatic Reference Counting设置为No即可。

     引用计数又分ARC(Auto Reference Counting) 自动引用计数 和 MRC(Manual Reference Counting) 人工引用计数。

     自动引用计数:iOS 5.0的编译器特 性,它允许⽤户只开辟空间,不⽤去释放空间。它不是垃圾回 收!它的本质还是MRC,只是编译器帮程序员默认加了释放的 代码。

     内存的开辟和释放 都由程序代码进⾏控制。相对垃圾回收来说,对内存的控制更 加灵活,可以在需要释放的时候及时释放,对程序员的要求较 ⾼,程序员要熟悉内存管理的机制。

     垃圾回收机制  

       程序员只需要开辟内存空间,不需要⽤代码的 形式释放,系统来判断哪些空间不再被使⽤,并回收这些内存 空间,以便再次分配。整个回收的过程不需要写任何代码,由 系统⾃动完成垃圾回收。Ja─a开发中⼀直使⽤的就是垃圾回收 技术。

        OC采⽤引⽤计数机制管理内存,每个对象都有⼀个引⽤ 计数器,⽤来记录当前对象的引⽤次数。 当⼀个新的引⽤指向对象时,引⽤计数器就加1,当去掉 ⼀个引⽤时,引⽤计数就减1。当引⽤计数到零时,该对 象的空间就被系统回收。 retainCount获取对象的引⽤计数。

     例如,厕所进去一个人,引用计数就要加1,出来一个人就要减1,等人全部出来后就变成了0,相当于释放掉了,被系统回收了。

    影响引用计数的方法

    1、 + alloc 开辟内存空间,让被开辟的内存空间的引⽤计数 从0变为1。

    2、 - retain 引⽤计数加1,如果对象之前引⽤计数为1,retain 之后变为2,如果引⽤计数是5,retain 之后变为6。

    3、 - copy 把某⼀对象的内容拷贝⼀份,拷贝出新的对象, 原有对象的引⽤计数不变,新的对象的引⽤计数变1。

    释放内存

    iOS5之前,使⽤ NSAutoreleasePool ⾃动释放池类创建对象。

    iOS5之后,不再推荐使⽤ NSAutoreleasePool 类,使⽤ @autoreleasepool{}替代。

    出了大括号,自动释放池才向各个对象发送release消息。

  • 相关阅读:
    goole的protoc文件[test_pb2.py]
    selenium中无页面基本配置
    连接数据库
    python计时器(打包exe即可)
    pip 升级 报No module named 'pip'错怎么处理-百度经验
    人脸识别之识别出某人并标记
    WIN7环境人脸检测及识别python实现系列(3)——为模型训练准备人脸数据
    安装pillow(python的图形界面库) PIL模块安装
    python 用pip安装cv2
    python调用摄像头拍照并保存
  • 原文地址:https://www.cnblogs.com/shensq/p/5208414.html
Copyright © 2020-2023  润新知