十二:内存简单介绍和OC的内存管理

一、内存简单介绍

内存结构

1、运行时分配

(1)栈:用户存放程序临时创建的局部变量(先进后出)。

(2)堆:动态分配内存段。

2、编译器分配

(1)BSS段:存放未初始化的全局变量和静态变量。

(2)数据段:已初始化的全局变量和静态变量。

(3)代码段:执行代码的一块区域。

地址由低到高:代码段 -> 数据段 -> BSS段-> 堆 -> 栈 

内存分配方式

1、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

3、从堆上分配,亦称动态内存分配。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

 

二、OC内存管理(iOS7.0后不用手动管理,可以了解相关原理)

1、进行内存管理的原因:是由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等。

2、内存管理范围:任何继承NSObject的对象,对其他的基本数据类型无效。

本质原因是存储空间不一样,对象存储于堆中,而其它局部变量主要存放于栈中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄露。

3、对象的基本结构:每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数,即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁。

在每个OC对象内部,都专门有4个字节的存储空间来存储引用计数器。

引用计数器的作用:判断对象是否需要回收的唯一依据就是计数器是否为0,若不为0则存在。
4、当给对象发送消息时,进行引用计数器操作

Retain消息:使引用计数器+1,改方法返回对象本身

Release消息:使引用计数器-1(并不代表释放对象)

retainCount消息:获得对象当前的引用计数器值

5、当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,书写格式如下:

1 - (void)dealloc
2 {
3     [super dealloc] //必须调用必须调用调用此方法,且必须写在最后
4 }

6、注意事项:

野指针错误:访问了一块坏的内存(已经被回收的,不可用的内存)。

僵尸对象:所占内存已经被回收的对象,僵尸对象不能再被使用。(打开僵尸对象检测)

空指针:没有指向任何东西的指针(存储的东西是0,null,nil),给空指针发送消息不会报错

注意:不能使用[p retaion]让僵尸对象起死复生。

7、内存管理原则

(1)只要还有人在使用某个对象,那么这个对象就不会被回收。

   只要你想使用这个对象,那么就应该让这个对象的引用计数器+1。

   当你不想使用这个对象时,应该让对象的引用计数器-1。

(2)谁创建,谁release

   如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者autorelease方法

   不是你创建的就不用你去负责

(3)谁retain,谁release。只要你调用了retain,无论这个对象时如何生成的,你都要调用release。

 

三、内存管理中的循环引用问题以及解决

若使用#import的方式相互包含,就会形成了循环引用。这时可以使用一个@class来代替其中一个#improt来解决循环引用问题,提高性能!

@class仅仅告诉编译器,在进行编译的时候把后面的名字作为一个类来处理。

书写规范:@class 类名;

作用:声明一个类,告诉编译器某个名称是一个类。

具体用法:1、在.h文件中使用@class来声明类。

     2、在.m文件中真正要使用到的时候,使用#import来包含类中的所有东西。

     3、两端循环引用的解决方法:一端使用retain,一端使用assign(使用assign的在dealloc中也不用再release)。

转载于:https://www.cnblogs.com/hissia/p/5448410.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java上传组件_java上传组件FileUpload

如果表单中有文件要上传,也就是有就需要在form标签中添加enctype"multipart/form-data"属性 如果添加此属性,在操作页面servlet中,用request.getParameter("name")获取普通表单数据就会出错java.lang.NullPointerExcepti…

第九周学习进度

第九周所花时间(包括上课)上课4小时,课后4小时代码量(行)      300博客量1了解到的知识点安卓开发环境的应用、服务器的连接转载于:https://www.cnblogs.com/wangzongze/p/5449535.html

百度推送java_关于百度推送,请教一下大家

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼2015-10-23 14:38:01,734 ERROR [main] - Context initialization failedorg.springframework.beans.factory.BeanCreationException: Error creating bean with name org.springframework.web.servlet.mvc.method.annotation.Requ…

java一般做什么_java开发一般做什么

4java怎么样学习编程的时候,一定要独立思考现在网络很发达,我见很多程序员总爱百度,包括我带的许多人都是这样,一个jdbc这么初级的东东,他们编程几年了,每次用还总是百度查。这个东西应该是熟记于心的&…

echarts饼状图mysql_echarts饼状图位置设置

ReactNative环境配置参考链接 Windows系统安装React Native环境 windows下React Native Android 环境搭建 在Windows下搭建React Native Android开发环境 ...(转载)PHP获取客户端、PHP获取服务器相关信息(转载)http://www.php100.com/html/webkaifa/PHP/PHP/2009/1027/3446.htm…

Fragment销毁时replace和add两个方法的区别

这个首先从一个bug说起,如图: 我们都知道fragment切换有两种方式: 1. replace方式 transaction.replace(R.id.content, IndexFragment); 2. add-hide-show方式 transaction.add(R.id.content, IndexFragment); transaction.hide(…

java setlocation_Java Point.setLocation方法代碼示例

本文整理匯總了Java中java.awt.Point.setLocation方法的典型用法代碼示例。如果您正苦於以下問題:Java Point.setLocation方法的具體用法?Java Point.setLocation怎麽用?Java Point.setLocation使用的例子?那麽恭喜您, 這裏精選的…

hdu_2089 不要62

数位动态规划 数位动态规划是求解一个大区间[L, R]中间满足条件Q的所有数字的个数(或者和,或其他)的一种方法。它通过分析每一位上的数字,一般用 dp[len][digit][...] 来表示状态“len位长的数字,最高位数字为digi…

java 当天唯一ids_java-为不同的时间字符串接收相同的ZonedDat...

当您调用LocalDate.parse时,您只获得日期部分(日,月和年),而丢弃其余部分. LocalDate没有时间字段(小时,分钟,秒和秒的一部分),因此它们只是被丢弃并丢失.然后,调用atStartOfDay(ZoneId.systemDefault()),它将时间设置为JVM默认时区的午夜.如果要保留所有内容(日期和时间),请将…

Spring的常见问题及答案

目录 Spring 概述依赖注入Spring beansSpring注解Spring数据访问Spring面向切面编程(AOP)Spring MVCSpring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的…

java 打印abcd_用JAVA编程统计字符串ABCD123!@#$%ab中大写字母、小写字母、数字、其它字符的个数并打印出来...

/*** 编程统计字符串"ABCD123!#$%ab"中大写字母、小写字母、数字、其它字符的个数并打 印出来。*/public class Job1Test {public static void main(String[] args) {String str1 new String("ABCD123!#$%ab");System.out.println("字符串&#xff1…

什么是P问题、NP问题和NPC问题

这或许是众多OIer最大的误区之一。你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。你要知道,大多数人此时所说的NP问题其实都是指的NPC问题。他们没有搞清楚N…

java jdbc 登录_java web JDBC 判断用户登录问题!

这是老师给我们讲课时候讲的一个实例!我没明白后来自己做练习没有按照老师的代码走!就是按我的理解敲了一遍最后敲成这样感觉越敲越晕!所以上来求教前辈们!Stringusernamerequest...这是老师给我们讲课时候讲的一个实例 &#xff…

子集生成 --二进制法

用二进制表示{0,1,2,3...n-1}的子集s;从右往左第i位表示元素i是否在集合s中。图2表示10100110是如何展示了集合{1,2,5,7}的。 注意:为了方便,最右边的为总是对应元素0,而不是元素1; 异或最重要的性质就是开关型---异或…

java正确的代码_对文件名为Test.java的java代码描述正确的是()

选C父类没有无参的构造函数,所以子类需要在自己的构造函数中显式调用父类的构造函数, 添加super("nm"); 否则报错: Implicit super constructorPerson() is undefined. Must explicitly invoke another constructorclass Person {S…

20150303+JQuery选择器-02

20150303JQuery选择器-02 三、文档处理 插入 删除 复制 替换 包裹 查找 1、插入操作——内部插入 jQuery <div> jQuery hello jQuery</div> l append(content) &#xff1a;将content内容插入到元素的尾部 l appendTo(content) &#xff1a;将匹配到的元素插入到co…

java实现记事本查找_Java实现记事本

首先说明&#xff0c;这是可能本人大学所写的最后一个Java程序了&#xff0c;接下来写C。一直想写这个程序很久了&#xff0c;作为跟计算器类似的经典小程序&#xff0c;写一下还是挺有意义的。本来觉得这程序不难写&#xff0c;其实各个部分综合起来&#xff0c;还是挺麻烦的&…

机器学习 —— 概率图模型(Homework: CRF Learning)

概率图模型的作业越往后变得越来越有趣了。当然&#xff0c;难度也是指数级别的上涨啊&#xff0c;以至于我用了两个周末才完成秋名山神秘车牌的寻找&#xff0c;啊不&#xff0c;CRF模型的训练。 条件随机场是一种强大的PGM&#xff0c;其可以对各种特征进行建模&#xff0c;同…

java生成四则运算表达式_生成四则运算(java实现)

|博客班级 | https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/ ||作业要求 | https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/homework/11376||作业目标 | 写一个能自动生成小学四则运算题目的程序 ||学号 | 3190704130 |代码如下&#xff1a;//main函数所在区域主要实现生成…

Kali Linux—借助 SET+MSF 进行网络钓鱼、生成木马、获主机shell、权限提升、远程监控、钓鱼邮件等完整渗透测试(三)

钓鱼邮件 当攻击者制作了钓鱼网站、木马程序后&#xff0c;便会想法设法将其传给受害者&#xff0c;而常见的传播方式便是钓鱼网站了。安全意识较差的用户在收到钓鱼邮件后点击邮件中的钓鱼链接、下载附件中的木马程序&#xff0c;便可能遭受攻击&#xff01; 工具简介 Swak…