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 ...
随机推荐
- HTML,CSS,JavaScript,json,xml之间的关系
1.浏览器工作原理: https://blog.csdn.net/Luncles/article/details/80320082 2.HTML,XML,JSON之间的关系: https://blog ...
- 将SublimeText加入右键菜单
将SublimeText加入右键菜单 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\SublimeText] @=&q ...
- 脏牛提权CVE-2016-5195
gcc -pthread dirtyc0w.c -o dirtyc0w 尝试使用gcc -pthread dirtyc0w.c -o dirtyc0w 编译该POC文件 gcc命令是一个编译器套件,可 ...
- 还是只使用console.log()进行调试?好吧,其实还有更多。
在浏览器控制台中打印消息无疑可以拯救所有开发人员. console.log()消息就像您的大多数疾病的药,同时调试了代码中的一些有线问题. 那里的大多数开发人员都喜欢— 让我们在浏览器中打印消息以了解 ...
- pandas 的常用方法
pandas的常用方法: 1.数据输入 2.数据查看 3.数据清洗 4.数据处理 5.数据提取 6.数据筛选 7.数据汇总 8.数据统计 9.数据输出 详情见: https://blog.csdn.n ...
- asp.net core系列 76 Apollo 快速安装模式下填坑和ASP.NetCore结合使用
前言:由于公司占时没有运维,出于微服务的需要,Apollo只能先装在windows 阿里云上跑起来,由于环境及网络等问题,在安装过程中遇到很多坑,算是一个个坑填完后,最终实现. 一. java jdk ...
- hdu2087kmp模板练习
题目网址:http://icpc.njust.edu.cn/Problem/Hdu/2087/ 代码: #include<bits/stdc++.h> using namespace st ...
- 《数据库优化》- MySQL视图
一.什么是视图 视图,是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改,视图基于的表称为基表.视图是存储在数据字典里的一条select语句. 通俗地讲,视图就 ...
- python逐行读取文本
一.使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. 二.需要导入import os 三.下面是逐行读取文件内容的三种方法: ...
- lvs + keepalived + gninx 高性能负载均衡
1,nginx 作为负载均衡器,在应用层实现了负载均衡和反向代理,在分布式集群中,能够有效的去处理大数据量,高访问的应用.但是,如果nginx 服务挂了怎么办? 为此,可以实现两台nginx或者多台n ...