• Foundation与Core Foundation内存管理基本原则简述


      内存管理是一个十分重要的事情,稍有不慎就会发生内存泄漏或者是野指针的错误。内存泄漏一般表示没有任何指针指向的内存区域,由于这块内存在对象图中无法查找到,所以有可能永远都无法回收,如果内存泄漏的空间比较大,这对于应用程序的性能是有十分大的影响的,特别是IOS中这种内存空间十分有限的系统内。野指针一般表示一块已经被回收或重新分配的内存区域,通过野指针操作这块内存都有可能引发无法预测的错误。

      那么如何正确的分配和释放内存是开发一款高性能的APP的一个重要方面。

      Apple官方定义了一套规范来约定我们开发中的一些内存管理原则。IOS中,Foundation(基于Objective-C)和Core Foundation(基于C语言)有着不同的规范。下面列举在ARC和MRC的两种环境下的编码规则。

    一、Foundation中的内存管理原则

      若方法名以:alloc/new/copy/mutablecopy开头

      1、MRC

        调用者需要负责释放(release)方法所返回的对象

      2、ARC

        编译器在编译阶段会自动根据上述规定来生成释放(release)方法。程序员无须手动释放,其实也不能调用释放相关方法,编译器会报错。

    二、Core Foundation中的内存管理原则

      若方法名中带有:create/copy/new/retain字眼,这个时候情况和Foundation中不一样,无论是ARC还是非ARC,我们都需要调用对应方法来释放对象例如:

      CFRelease(xxx);来释放Core Foundation对象。值得注意的是,我们使用CoreGraphics绘图框架, CGPathCreateMutable()也需要遵守上述原则,因为CoreGraphics是基于Core Foundation的。

      其实有时候也不需要死记到底要不要release,只要方法名满足上述要求,下面自觉调用release,编译器报错就说明这件事,编译器已经帮我们做了,我们不需要再做释放操作。当然这仅仅是一种非常规手段,个人只要牢记:编码和做人一样,都应该负起责任,你既然创建了它,就有责任释放它,你既然告诉系统你想使用它,那你也有责任去释放它,我们既然把它带到这个世界,就不能放任不管,那样简直天理难容。好吧,扯远了!有关于内存管理中的几个常见关键字(strongweak etainassigncopyunsafe_unretained)的意义,有时间再从为知笔记上整理过来。

  • 相关阅读:
    常用的学生、课程、成绩、教师表的查询
    flutter 自定义TabBar
    Flutter 设置input边框
    Flutter ReorderableListView 可拖拽的列表
    Flutter NotificationListener 监听列表的滚动
    Flutter 使用Tabbar不要Title
    Nestjs 验证对象数组
    postman 发送数组
    JS面向切面编程AOP
    什么是匿名函数、什么是闭包函数?
  • 原文地址:https://www.cnblogs.com/forwk/p/4842219.html
Copyright © 2020-2023  润新知