AJ整理问题之:内存堆栈
内存
数据在内存中的存放
在计算机中,运行的应用程序的数据都是保存在内存中的。
不同类型的数据,保存的内存区域不同,其中包括:
1:栈区(stack)由编译器自动分配并释放,一半存放函数的参数值,局部变量等。
2:堆区(heap)由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收。
3:全局区(静态区)全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放。
上面三个很重要,下面三个了解
4:文字常量区:存放常亮字符串,程序结束后由系统释放。
5:程序代码区:存放函数的二进制代码。
6:寄存器去:用来保存栈顶指针和指令指针(我们基本用不到。。。)。
栈内存区中得数据
栈区内存是压栈的讲究
特点:先进后出。
系统给自动回收。
由系统自动分配,速度较快。但程序员是无法控制的。
int sum(int x, int y)
{
NSLog(@"x: %p, Y: %p", &x, &y);
int result = x + y;
NSLog(@"%p", &result);
return result;
}
void demo1()
{
// 在栈区中的变量,i本质上对应"内存地址"的"标签"
// 指针 * 表示指向内容空间的内容 & 表示地址
int i = 10;
i = i + 5;
NSLog(@"==== %d", *(&i));
int j = 20;
NSLog(@"i:%p, J:%p", &i, &j);
int result = sum(i, j);
NSLog(@"%d %p", result, &result);
}
内存示意图
堆内存区中得数据
1:由于栈内存中的空间有限,(iOS=1M,MAC=8M)iOS的应用程序中,对象都是建立在堆中的。
2:堆区包括系统内存和虚拟内存(磁盘开辟缓存),由所有正在运行的应用程序共享使用。
3:堆区中的内存分配由操作系统负责,操作系统
使用一个“链表”统一维护所有已经分配的内存记录。
4:由于堆区是由所有应用程序共享的,操作系统
以匿名【只记录内存地址和大小,不记录具体类型】的方式记录已经分配的内存区域。
5:要访问堆区中得数据,必须通过指针的方式才可以进行,指针的类型决定了访问对中数据的方式。
6:当某一内存区域不再使用时,程序需要通知操作系统回收该内存区域,从而可以保证该内存区域被其他程序再次使用,否则,该区域将永远无法被再次分配,这就是传说中的“内存泄露”。
7:如果某一区域已经被释放,仍然试图访问该区域,会提示“坏内存访问”,这就是传说中的“野指针访问”。
8:相比较栈区,堆区中得效率要低很多,同时容易出现内存碎片。
9:相比较栈区,堆区中得访问方式更加灵活,对象占用的内存也可以更大。
int main(int argc, const char * argv[])
{
@autoreleasepool {
// 在堆中所有的变量类型都是匿名访问的
// 能否访问对象的属性,或者调用方法,"取决于指定变量的类型"
// 所有堆中的变量都是通过指针来访问的
id p = [[Person alloc] init];
[p setName:@"zhangsan"];
NSLog(@"%@ %p", [p name], p);
// 1. 将p指向 NULL(地址) => 0
// 2. 释放p
// ** 在OC/C++中,nil可以调用任何的方法,都不会报错
// nil是指针指向NULL的空对象 0
p = nil;
NSString *str = p;
NSLog(@"%ld %p", str.length, p);
}
return 0;
}
堆区中的内存分配由操作系统负责,操作系统
使用一个“链表”统一维护所有已经分配的内存记录。
链表:
由上部分代码引申出新的问题:
nil NULL Nil都什么关系?
nil和 null和NSNull的区别
nil是一个对象,而NULL是一个值,我的理解为nil是将对象设置为空,而null是将基本类型设置为空的,个人感觉有点像属性当中,基本类型分配为assign NSString类型一般分配copy,而对象一般用retain。而且我们对于nil调用方法,不会产生crash或者抛出异常。
看一段
nil -> Null-pointer to objective- c object
NIL -> Null-pointer to objective- c class
null-> null pointer to primitive type or absence of data.
看一下用法
NSURL *url = nil;
Class class = Nil;
int *pointerInt = NULL;
nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空。这些可以理解为nil,Nil, NULL的区别吧。
AJ整理问题之:内存堆栈的更多相关文章
- STM32/GD32上内存堆栈溢出探测研究
无数次遭受堆栈溢出折磨,随着系统变得复杂,故障点越来越难以查找!主要溢出情况如下:1,一般RAM最后两块空间是堆Heap和栈Stack,堆从下往上用,栈从上往下用,任意一个用完,都会进入对方的空间2, ...
- Java细节整理——数组与内存控制
重点:使用Java数组之前,必须对数组对象进行初始化. 当数组的所有元素都被分配了合适的内存空间,并指定了初始值时,数组的初始化完成.程序以后将不能重新改变数组对象在内存中的位置和大小. 知识点整理: ...
- 关于掌握C#的内存堆栈概念
很多时候,我们使用C#语言书写业务逻辑时,并不会太多地主动考虑到内存的占用和分配问题,但编的程序多了,就总会遇到一些性能问题.提到"性能"二字,就不得不考虑CPU和内存,而提到内存 ...
- AJ整理问题之:copy,对象自定义copy 什么是property
AJ分享,必须精品 copy copy的正目的 copy 目的:建立一个副本,彼此修改,各不干扰 Copy(不可变)和MutableCopy(可变)针对Foundation框架的数据类型. 对于自定义 ...
- LyScript 实现对内存堆栈扫描
LyScript插件中提供了三种基本的堆栈操作方法,其中push_stack用于入栈,pop_stack用于出栈,而最有用的是peek_stack函数,该函数可用于检查指定堆栈位置处的内存参数,利用这 ...
- arcgis engine 中出现的内存堆栈溢出问题。
两种解决方案: 1.循环加载mxd文档的时候出现的堆栈溢出,解决办法是每次循环结束时清空FeatureLayer,感觉并不好,但是确实可以实现功能. 2.循环调取featureclass的search ...
- PHP对象在内存堆栈中的分配
对象在PHP里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?内存从逻辑上说大体上是分为4段,栈空间段.堆空间段. ...
- JAVA对象及属性的内存堆栈管理(通过小程序简单说明)
JAVA在执行过程中会划分4个内存区域(heap.stack.data segment.code segment)代码区(codesegment):java开始执行会把代码加载到code segmen ...
- eclipse JVM Tomcat 内存堆栈大小设置
1, 设置Eclipse内存使用情况 修改eclipse根目录下的eclipse.ini文件 -vmargs //虚拟机设置 -Xms40m //初始内存 -Xmx256m //最大内存 -Xmn ...
随机推荐
- java 获取 list 集合获取指定的 字段 数组
/** * * AdminEntity 管理员实体类 * getAdminId 获取管理员实体类中的id * */ @Testvoid adminIdList () { List<AdminEn ...
- Web的服务器和Javaweb结构
上一节介绍了Eclipse中集成Tomcat环境搭建及javaweb项目的创建,下面说说什么是web服务器及javaweb的结构. 1.web应用的演变 1.1 b/s与c/s模式 B/S:Brows ...
- 《面试经典系列》- MySQL数据库存储引擎
一.MySQL有多少种存储引擎? 在MySQL5之后,支持的存储引擎有十多个,但是我们常用的就那么几种,而且,默认支持的也是 InnoDB. 通过命令:show engines \g,我们可以查看到当 ...
- python-pathlib
2019-12-12 04:27:17 我们知道在不同的操作系统中文件路径的组成方式是不同的,因此在python中关于路径的问题以往我们通常采用os.path.join来进行路径的字符串级别的串联,通 ...
- FTP服务器与客户端的安装与配置
FTP服务器安装与配置 1. 切换到root用户: su root 2. 查看系统中是否安装了vsftpd,可以通过执行命令 : rpm -qa | grep vsftpd 3. 如果没有安装 v ...
- JavaScript之onclick事件
对于给同一个元素添加两个点击事件时,其中一个是通过js获取元素添加点击事件另一个是通过内联的方法为元素添加事件. 执行之后只会执行通过元素获取的点击事件.而内联式的添加点击事件是不会执行的 还有一个就 ...
- java 环境变量配置与第一个程序运行
从开始下载jdk,到运行出java第一个程序 ,花了5天时间 ,不过我相信万事开头难 ,以后会越来越好的 ,加油! jdk的下载: 在oracle官网上即可下载,jdk安装包,下载完以后运行安装 ,路 ...
- 线程安全,syncronized 用法
1,为什么有线程安全问题? 当多个线程同时共享同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题.但是做读操作是不会发生数据冲突问题. public class Tra ...
- Spring的IOC容器学习笔记
(一)Spring的IOC学习 在applicationContext.xml来配置bean,通过该接口,在主程序中,可以指定初始化的对象,不需要在进行赋值操作,直接在xml里配置好. 接下来分享的是 ...
- 20175314 《Java程序设计》第十周学习总结
20175314 <Java程序设计>第十周学习总结 教材学习内容总结 进程与线程:一个进程的进行期间可以产生多个线程. Java内置对多线程的支持,计算机只能执行线程中的一个,Java虚 ...