内存管理是一个十分重要的事情,稍有不慎就会发生内存泄漏或者是野指针的错误。内存泄漏一般表示没有任何指针指向的内存区域,由于这块内存在对象图中无法查找到,所以有可能永远都无法回收,如果内存泄漏的空间比较大,这对于应用程序的性能是有十分大的影响的,特别是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,编译器报错就说明这件事,编译器已经帮我们做了,我们不需要再做释放操作。当然这仅仅是一种非常规手段,个人只要牢记:编码和做人一样,都应该负起责任,你既然创建了它,就有责任释放它,你既然告诉系统你想使用它,那你也有责任去释放它,我们既然把它带到这个世界,就不能放任不管,那样简直天理难容。好吧,扯远了!有关于内存管理中的几个常见关键字(strong\weak\retain\assign\copy\unsafe_unretained)的意义,有时间再从为知笔记上整理过来。

Foundation与Core Foundation内存管理基本原则简述的更多相关文章

  1. Objective-C:Objective-C 和 Core Foundation 对象相互转换的内存管理

    Objective-C 和 Core Foundation 对象相互转换的内存管理 iOS允许Objective-C 和 Core Foundation 对象之间可以轻松的转换,拿 NSString ...

  2. IOS - Foundation和Core Foundation掺杂使用桥接

    Foundation和Core Foundation掺杂使用桥接 Toll-Free Bridging 在cocoa application的应用中,我们有时会使用Core Foundation(CF ...

  3. Objective-C 和 Core Foundation 对象相互转换的内存管理总结

    本文转载至 http://blog.csdn.net/allison162004/article/details/38756649 OS允许Objective-C 和 Core Foundation ...

  4. Core Foundation框架介绍

    Core Foundation框架介绍 **参考网址: ARC下OC对象和CF对象之间的桥接 Core Foundation框架介绍 Core Foundation框架 Core Foundation ...

  5. Linux内核之内存管理完全剖析

    linux虚拟内存管理功能 ? 大地址空间:? 进程保护:? 内存映射:? 公平的物理内存分配:? 共享虚拟内存.实现结构剖析   (1)内存映射模块(mmap):负责把磁盘文件的逻辑地址映射到虚拟地 ...

  6. 《从零开始学Swift》学习笔记(Day 61)——Core Foundation框架之内存管理

    原创文章,欢迎转载.转载请注明:关东升的博客 在Swift原生数据类型.Foundation框架数据类型和Core Foundation框架数据类型之间转换过程中,虽然是大部分是可以零开销桥接,零开销 ...

  7. 《从零開始学Swift》学习笔记(Day 61)——Core Foundation框架之内存管理

    原创文章,欢迎转载. 转载请注明:关东升的博客 在Swift原生数据类型.Foundation框架数据类型和Core Foundation框架数据类型之间转换过程中,尽管是大部分是能够零开销桥接,零开 ...

  8. 《从零开始学Swift》学习笔记(Day 62)——Core Foundation框架之内存托管对象与非托管对象

    原创文章,欢迎转载.转载请注明:关东升的博客 内存托管对象 Swift中调用Core Foundation函数获得对象时候,对象分为:内存托管对象和内存非托管对象. 内存托管对象就是由编译器帮助管理内 ...

  9. iOS开发系列-Foundation与CoreFoundation内存管理

    概述 对于初学者来说,可能仅只能将ARC用在objective-c对象上(也即继承自NSObject的对象),但是如果涉及到较为底层的东西,比如Core Foundation中的malloc()或者f ...

随机推荐

  1. delphi 修改Hint的字体和颜色

    //修改Hint的字体和颜色   public    { Public declarations }    procedure Sshowhint(var hintstr:string;var can ...

  2. [AngularJS] Using $anchorScroll

    If you're in a scenario where you want to disable the auto scrolling, but you want to control the sc ...

  3. Android横竖屏切换处理

    Android横竖屏要解决的问题应该就两个: 1.布局问题:2.重新载入问题   一.布局问题: 如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你 ...

  4. gdb在运行maintenance info program-spaces命令时coredump

    coredump时的信息: (gdb) maintenance info program-spaces *** Error in `gdb': free(): invalid pointer: 0x0 ...

  5. 详解C/C++函数指针声明 ( *( void(*)())0)();

     ( *( void(*)())0)(); float *pf; 这个声明的含义是*pf是一个浮点数,也就是说,pf是一个指向浮点数的指针. float *g() , (*h)(); 表示*g()与( ...

  6. 基础笔记(一)Java 集合

    集合日常用到的有List,Set,Map等等. List List常用的有2种,包括ArrayList与LinkedList.这两种List的主要区别在于底层的数据结构的差别.ArrayList是基于 ...

  7. 本地计算机上的XXX服务启动后停止。某些服务在未由其它服务或程序使用时将自动停止。咋整?

    用C#写个windows服务,安装部署后去启动时,提示说“本地计算机上的XXX服务启动后停止.某些服务在未由其它服务或程序使用时将自动停止”.咋整?就像下面酱紫: 度娘说不知道咋整,我想把程序附加到w ...

  8. 使用addClass()设置自增类名

    今天在翻阅JQuery API的时候发现,addClass()方法不仅可以添加类,同时可以调用回调函数. 代码如下: <body> <p>item1</p> < ...

  9. HDU 3533 Escape (BFS + 预处理)

    Escape Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  10. [BigData]关于Hadoop学习笔记第四天(PPT总结)(一)

    课程安排 Partitioner编程** 自定义排序编程** Combiner编程** 常见的MapReduce算法** ---------------------------加深拓展-------- ...