zoukankan      html  css  js  c++  java
  • 猫猫整理问题之:内存堆栈

    猫猫分享
    原文地址:http://blog.csdn.net/u013357243?viewmode=contents

    内存

    数据在内存中的存放

    在计算机中,运行的应用程序的数据都是保存在内存中的。
    不同类型的数据,保存的内存区域不同,其中包括:

    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的区别吧。

    ps:新建iOS交流学习群:304570962
    可以加猫猫QQ:1764541256 或则微信znycat
    让我们一起努力学习吧。
    原文:http://blog.csdn.net/u013357243?viewmode=contents

  • 相关阅读:
    HTML 常见标签part1
    HTML 初始
    jenkins远程执行脚本不退出
    jenkins 持续集成工具安装
    jenkins 杀掉衍生进程解决办法
    日志分割工具-crononlog
    可视化库 pygal 生成png中文乱码
    可视化库 pygal 无法保存成本地文件
    一个很好用的ORM库--peewee
    3 种进度条 -- 记录
  • 原文地址:https://www.cnblogs.com/znycat/p/4419172.html
Copyright © 2011-2022 走看看