如果要说iOS的内存管理问题,先要知道Objective-C是一门什么样的语言 —> Objective-C是一门面向对象的语言。

我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在Objective-C中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上入:int float 等)。如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存。其他高级语言如C#、Java都是通过垃圾回收来(GC)解决这个问题的,但在Objective-C中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人员手动维护。今天将着重介绍Objective-C内存管理:

一、Objective-C 内存管理的对象

1、内存管理的对象主要有两类:

①基本数据类型:int 、float、 struct 等。

②引用类型:继承自NSObject类的所有Objective-C对象。

第一种基本数据类型不需要我们管理,第二种需要管理。

2、管理内存的原理:

①值类型一般都会被放入栈中(先进后出),引用类型会被放到堆中,当给对象分配内存空间时,会随机从内存当中开辟空间,对象和对象之间可能会存在很多碎片,这些碎片空间需要我们管理。

②栈内存从性能上来说优于堆内存,数据量过大的时候,我们会把数据存入堆中,然后在栈中存放堆的地址,这样调用数据的时候,就可以快速的通过栈中的地址拿到堆中的数据。

③装箱:把int等包装成NSNumber(会降低性能);

拆箱:把NSNumber转化为float等 (注意类型错误时候的安全性问题);

装箱和拆箱会增加代码的运行时间,降低代码可读性,影响性能。

二、内存管理方式 主要是MRC和ARC管理方式;

MRC:手动管理内存有时候并不容易,因为对象的引用有时候是错综复杂的,对象之间可能互相交叉引用,此时需要遵循一个法则:谁创建,谁释放。

ARC:在Objective-C中也有一种内存自动释放的机制叫做“自动引用计数”(或“自动释放池”),与C#、Java不同的是,这只是一种半自动的机制,有些操作还是需要我们手动设置的。自动内存释放使用@autoreleasepool关键字声明一个代码块,如果一个对象在初始化时调用了autorelase方法,那么当代码块执行完之后,在块中调用过autorelease方法的对象都会自动调用一次release方法。这样一来就起到了自动释放的作用,同时对象的销毁过程也得到了延迟(统一调用release方法)。

autorelease方法不会改变对象的引用计数器,只是将这个对象放到自动释放池中;

自动释放池实质是当自动释放池销毁后调用对象的release方法,不一定就能销毁对象(例如如果一个对象的引用计数器>1则此时就无法销毁);

由于自动释放池最后统一销毁对象,因此如果一个操作比较占用内存(对象比较多或者对象占用资源比较多),最好不要放到自动释放池或者考虑放到多个自动释放池;

ObjC中类库中的静态方法一般都不需要手动释放,内部已经调用了autorelease方法;

三、MRC与ARC混编 在ARC项目中,对MRC文件可以添加 -fno-objc-arc标识;在MRC中,对ARC的文件可以添加 -fobjc-arc 的标识。(或者可以把MRC文件转为ARC,现在多用ARC,但是有些第三方框架还是MRC的需要处理);

ios+android+内存管理,iOS内存管理相关推荐

  1. webdav ios android,iWork(iOS 版):使用 WebDAV 服务

    如果您有权访问 WebDAV 服务器,则可通过 iOS 设备传输 iWork(iOS 版)文稿,例如将类似文稿拷贝到 WebDAV 服务器,或从该服务器拷贝类似文稿.按照以下步骤执行此操作. 在 iW ...

  2. 国内用户ios android比例,国内iOS、Android系统的设备总量已达到了2亿

    首先,在2012年第三季度时,国内iOS.Android系统的设备总量已达到了2亿.在今年3月的时候,这一指标只有8700万,也就是说设备在半年内增长了125%.而在设备量大增的同时,用户也变得依赖移 ...

  3. ios android md5加密,iOS中使用MD5加密

    在iOS中使用MD5加密较简单,需要引入头文件CommonCrypto/CommonDigest.h,我们单独新建一个用于MD5加密的类Encryption,此类继承NSObject. Encrypt ...

  4. ios android 手柄,升级至iOS 13系统iPhone现已支持Xbox手柄

    今天(9月20日)iOS 13系统正式推送上线,更新至iOS 13系统的iPhone设备现已可通过蓝牙支持Xbox手柄.PS4手柄.iOS设备支持Xbox手柄对于iOS平台游戏.Apple Arcad ...

  5. 潮人篮球ios android,潮人篮球ios怎么在电脑上玩?潮人篮球ios电脑版玩法教程!...

    潮人篮球ios怎么在电脑上玩呢?现在有很多小伙伴都在玩潮人篮球手游,不过相对于传统的在手机上进行游戏,很多人都倾向于新玩法,就是在电脑上玩潮人篮球.下面小编就给亲们介绍下潮人篮球ios电脑版玩法教程哈 ...

  6. 【iOS开发】——MRC(手动内存管理)的一些补充

    [iOS开发]--MRC(手动内存管理)的一些补充 前言 野指针与空指针 多个对象内存管理的思想 玩家没有使用过房间 一个玩家使用一个游戏房间的情况 一个玩家使用一个房间 r 后,换到另一个房间 r2 ...

  7. iOS开发——MRC(手动内存管理)

    iOS开发--MRC(手动内存管理) 内存分配区域 栈区 堆区 总结 常量区 总结 代码区 总结 全局区 关于如何查看一个对象在堆区 / 栈区 需要知道的知识 手动引用计数MRC 四个法则 非自己生成 ...

  8. 【iOS沉思录】iOS内存管理试题总结与详解

    "iOS中的GC垃圾回收机制与内存管理机制以及block" 问题:僵尸对象.野指针.空指针分别指什么,有什么区别? 僵尸对象:一个OC对象引用计数为0被释放后就变成僵尸对象了,僵尸 ...

  9. Android系统中的进程管理:内存的回收

    本文是Android系统进程管理的第三篇文章.进程管理的前面两篇文章,请参见这里: Android系统中的进程管理:进程的创建 Android系统中的进程管理:进程的优先级 本文适合Android平台 ...

  10. Android官方开发文档Training系列课程中文版:高效显示位图之管理位图内存

    原文地址:http://developer.android.com/training/displaying-bitmaps/manage-memory.html 除了在上一节中描述的步骤之外,还有一些 ...

最新文章

  1. TensorFlow各版本下载地址,强烈推荐
  2. HDU 1385 Minimum Transport Cost
  3. Linux 操作 一批文件或者文件夹
  4. [APIO/CTSC 2007]数据备份(贪心+堆)
  5. centos7搭建elk
  6. 全球通用头像gravatar介绍
  7. 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
  8. Atitit.各种 数据类型 ( 树形结构,表形数据 ) 的结构与存储数据库 attilax 总结
  9. paip.DEVSUIT ADMIN 初次使用时出现两个LICENSE提醒
  10. OpenGL ——安装和环境配置
  11. 【车牌识别】基于模板匹配算法实现国外车牌识别附matlab源码
  12. 菜鸟c语言app,菜鸟学C语言app下载-菜鸟学C语言下载 3.0.0 手机版 - 河东软件园
  13. CTSCAPIOTHUPC2018颓废记
  14. Android中实现图片编辑功能
  15. NetFPGA-1G-CML从零开始环境配置
  16. Shell脚本读取mysql结果集各数据项的值
  17. 嵌入式linux驱动-LCD液晶屏驱动
  18. oracle数据库锁表很多,oracle锁表的原因_数据库
  19. JavaWeb期末考试复习资料
  20. 如何做一名算法应用工程师?

热门文章

  1. 【数字信号处理】基于matlab数字信号同步压缩变换【含Matlab源码 1534期】
  2. 【优化算法】多目标利希滕贝格算法(MOLA)【含Matlab源码 1434期】
  3. 【TSP】基于matlab GUI遗传算法求解旅行商问题【含Matlab源码 1333期】
  4. 【图像加密】基于matlab仿射变换数字图象置乱【含Matlab源码 1171期】
  5. 【笔检测】基于matlab模板匹配+PCA笔检测【含Matlab源码 1093期】
  6. 【气动学】基于matlab导弹拦截计算方法【含Matlab源码 982期】
  7. 【人脸识别】基于matlab GUI Gabor+SVM比较PCA+SVM人脸识别【含Matlab源码 685期】
  8. 【声源定位】基于matlab阵列流形矩阵信号显示【含Matlab源码 549期】
  9. java本地储存set_没有数据库的情况下,JAVA如何在本地保存信息
  10. java虚拟机的gc机制的优缺点_深入Java虚拟机之 -- 总结面试篇