3.1 OC本性之 内部存款和储蓄器中国共产党第五次全国代表大会区域

3.1 OC性情之 内部存款和储蓄器中国共产党第五次全国代表大会区域,oc中国共产党第五次全国代表大会

此篇为针对Objective-c语言入门的基础知识,为了能让大家更清楚的理解,此整理中编写了许多的代码案例和部分截图,如有错误之处,望指正,愿与您相互交流学习,共同进步!---"会飞的猴子_阿新" (同时还要向刀哥致敬)

本篇目标是:  理解内存五大区域及各自的职责

目录结构

  • 00.简述
    1. 分红和自由(面试常被问到)
  • 02.栈区和堆区
    • 2.1 栈区
      • 2.1.1 栈区中的保存(栈区的天职/存储的剧情)
      • 2.1.2 栈区的特征
      • 2.1.3 其他
    • 2.2 堆区
      • 2.2.1 堆区中保存:
      • 2.2.2能力所能达到透露堆区的风味
  • 0.3 全局变量、静态变量和常量

    • 3.1 全局变量/静态变量/常量保存的内存区域
      • 3.1.1 教科书中 全局变量 和 静态变量 的存款和储蓄区域
      • 3.1.2 Xcode 8 中 全局变量 和 静态变量 的存放区域
      • 当心:(全局/静态变量,常量)教科书与xcode8验证有一些出入
        • (1) xcode8 “全局变量”实际存款和储蓄区域案例表明:
        • (2)xcode8 “静态变量”实际存款和储蓄区域案例表明:
          • so–>面试注意:
        • (3)xcode8 “常量”实际存款和储蓄区域案例注明:
    • 3.2 BSS段(静态区)
    • 3.3 数据段(常量区)
    • 3.4 全局变量与全局静态变量的界别

        • 注意:
          • 1.怎么OC中差非常的少不采纳 全局变量?
          • 2.无法把 全局变量 定义在头文件中
          • 3.在程序支付时,全局变量 和 静态变量 都不能够重名
          • 4.静态变量 的修改日常只是在 定义当前静态变量的公文
            内部开始展览
    • 3.5 静态变量的正确性用法

    • 3.6 常量
  • 本篇首要学习指标回想:
    • 1.1 记念内部存款和储蓄器中国共产党第五次全国代表大会区域的称呼
    • 1.2 回忆栈区/堆区的职务及特色
    • 1.3 记念全局变量/静态变量/常量保存的内部存款和储蓄器区域
  • 结束语

00.简述

程序要想执行,第一步就需要 被加载到内存中

内存五大区域: 栈区,堆区,BSS段(静态区),常量区(数据段),代码段.

此篇为针对Objective-c语言入门的基础知识,为了能让大家更清楚的理解,此整理中编写了许多的代码案例和部分截图,如有错误之处,望指正,愿与您相互交流学习,共同进步!---"会飞的猴子_阿新" (同时还要向刀哥致敬)

此篇为针对Objective-c语言入门的基础知识,为了能让大家更清楚的理解,此整理中编写了许多的代码案例和部分截图,如有错误之处,望指正,愿与您相互交流学习,共同进步!---"会飞的猴子_阿新" (同时还要向刀哥致敬)

OC中,内部存款和储蓄器一般分为中国共产党第五次全国代表大会区域

01. 分配和自由(面试常被问到)

  • 栈区 (stack [stæk]): 由编写翻译器自动分配释放

  • 堆区 (heap [hiːp]):
    由技士分配释放,若技术员不自由,晤面世内部存款和储蓄器泄漏

  • BSS 段 : 程序停止后由系统释放

  • 数据段 : 程序甘休后由系统释放

  • 代码段:程序甘休后由系统释放

    先后 编写翻译链接 后的二进制可进行代码

02.栈区和堆区

int main(int argc, const char * argv[]) {

    // 局部变量是保存在栈区的
    // 栈区变量出了作用域之后,就会被销毁
    NSInteger i = 10;

    NSLog(@"%zd", i);

    // 局部变量是保存在栈区的
    // 赋值语句右侧,使用 new 方法创建的对象是保存在堆区的
    // xinge 变量中,记录的是堆区的地址
    // 在 OC 中,有一个内存管理机制,叫做 `ARC`,可以自动管理 OC 代码创建对象的生命周期
    // 因此,在开发 OC 程序的时候,程序员通常不需要考虑内存释放的工作
    LJXPerson *xinge = [LJXPerson new];
    NSLog(@"%@", xinge);
    return 0;
}

10 <LJXPerson: 0x100404b70>

本篇目的是: 明白内部存款和储蓄器中国共产党第五次全国代表大会区域及各自的天职

本篇指标是: 明白内存中国共产党第五次全国代表大会区域及各自的天职

程序要想举行,第一步就须要 被加载到内部存储器中

    • 积攒局地变量和实参
    • 由编写翻译器自动分配释放
    • 储存空间有限
    • 地点是连接的
    • 地方分配从大到小
    • 访谈速度快
    • 允许工程师本身报名的上空,必要程序猿自个儿主宰,会油但是生内部存款和储蓄器泄漏
    • 动用 new 方法创造的指标保存在堆区
    • 被创造对象的装有成员变量保存在堆区中
    • 地方是不接二连三的
    • 速度未有栈区快。地址不总是,有贰个寻中的进度
  1. BSS段 (静态区)

    • 仓库储存未有发轫化的全局变量和静态变量
  2. 数据段 (常量区)

    • 用来存储已经开头化的全局变量,静态变量还会有常量
  3. 代码段

    • 用来存款和储蓄程序的代码。

2.1 栈区

栈区 (stack [stæk]) : 由编写翻译器自动分配释放

目录结构

  1. 栈区: 局地变量和方式实参
  2. 堆区:OC中使用new方法创立的靶子,被创制对象的有所成员变量保存在堆区中.
  3. BSS段:教科书:未被起头化的全局变量和静态变量.Xcode8中:
    全局变量和静态变量,不管有未有被伊始化,都寄存在BSS段中.验证见本篇中的案例.
  4. 常量区:教科书: 存款和储蓄已经开头化的全局变量,静态变量,常量.xcode8:
    存款和储蓄常量
  5. 代码段:
    程序的代码.图片 1图片 2内部存款和储蓄器中国共产党第五次全国代表大会区域01

参考:3.1 OC个性之
内部存款和储蓄器中国共产党第五次全国代表大会区域

2.1.1 栈区中的保存(栈区的职务/存款和储蓄的剧情)

  • 局部变量
  • 方法实参(eg:在main函数中,调用方法,方法中的实参)
  • 00.简述
  • 01.
    分配和刑释(面试常被问到)
  • 02.栈区和堆区
    • 2.1
      栈区

      • 2.1.1
        栈区中的保存(栈区的天职/存款和储蓄的从头到尾的经过)
      • 2.1.2
        栈区的表征
      • 2.1.3
        其他
    • 2.2
      堆区

      • 2.2.1
        堆区中保存:
      • 2.2.2可见表露堆区的本性
  • 0.3
    全局变量、静态变量和常量

    • 3.1
      全局变量/静态变量/常量保存的内部存款和储蓄器区域

      • 3.1.1 教科书中 全局变量 和 静态变量
        的囤积区域
      • 3.1.2 Xcode 8 中 全局变量 和 静态变量
        的存储区域
      • 留神:(全局/静态变量,常量)教科书与xcode8验证有一些异样
        • (1) xcode8
          “全局变量”实际存款和储蓄区域案例表明:
        • (2)xcode8
          “静态变量”实际存款和储蓄区域案例表达:

          • so–>面试注意:
        • (3)xcode8
          “常量”实际存款和储蓄区域案例注脚:
    • 3.2
      BSS段(静态区)
    • 3.3
      数据段(常量区)
    • 3.4
      全局变量与全局静态变量的区分

        • 注意:
          • 1.怎么OC中大致不接纳全局变量?
          • 2.不能够把 全局变量
            定义在头文件中
          • 3.在程序支付时,全局变量 和 静态变量
            都无法重名
          • 4.静态变量 的改换日常只是在 定义当前静态变量的文件
            内部举行
    • 3.5
      静态变量的不利用法

    • 3.6
      常量
  • 本篇首要学习目的回想:
    • 1.1
      记念内部存款和储蓄器中国共产党第五次全国代表大会区域的名目
    • 1.2
      纪念栈区/堆区的天职及特点
    • 1.3
      记念全局变量/静态变量/常量保存的内存区域
  • 结束语
  • 栈区 (stack [stæk]): 由编写翻译器自动分配释放

2.1.2 栈区的特色

  • 存储空间有限 . iphone的栈区大小独有512k(暗许) ,特别轻易
  • 连续性 . 栈区的地点是连连的
    图片 3

部分代码:
#import <Foundation/Foundation.h>
#import "LJXPerson.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSInteger i = 10;
        NSLog(@"i 的栈区地址是 %p", &i);

        NSInteger j = 10;
        NSLog(@"j 的栈区地址是 %p", &j);

        // xiaoming 变量中,存储的是 LJXPerson 
        对象的内存地址(堆区的内存地址)
        LJXPerson *xinge = [LJXPerson new];
        NSLog(@"xinge 的栈区地址是 %p", &xinge);

        double height = 10;
        NSLog(@"height 的栈区地址是 %p", &height);
        .......

i 的栈区地址是 0x7fff5fbff768 j 的栈区地址是 0x7fff5fbff760 xinge 的栈区地址是 0x7fff5fbff758 height 的栈区地址是 0x7fff5fbff750

  • 地址分配从大到小. 栈区地址按照分配的各类,由大到小顺序排列
  • 访问速度快.
  • 系统管理. (栈区的内部存款和储蓄器由系统管理)

00.简述

程序要想进行,第一步就要求 被加载到内部存款和储蓄器中
内存五大区域: 栈区,堆区,BSS段(静态区),常量区(数据段),代码段.

  1. 栈区: 局部变量和艺术实参
  2. 堆区:OC中应用new方法创造的目的,被创制对象的保有成员变量保存在堆区中.
  3. BSS段(也叫静态区):
    教科书:未被起始化的全局变量和静态变量.
    Xcode8中:
    全局变量和静态变量,不管有未有被初步化,都存放在BSS段中.验证见本篇中的案例.
  4. 常量区(也叫数据段):
    读本: 存款和储蓄已经初叶化的全局变量,静态变量,常量.
    xcode8: 存款和储蓄常量
  5. 代码段: 程序的代码.
    图片 4
    图片 5

  6. 分红和刑释(面试常被问到)

  • 栈区 (stack [stæk]): 由编写翻译器自动分配释放

    1. 有的变量是保留在栈区的
    2. 办法调用的实参也是保留在栈区的
  • 堆区 (heap [hiːp]):
    由程序猿分配释放,若技士不自由,会现出内部存款和储蓄器泄漏

    1. 赋值语句侧边 使用 new 方法成立的目的
    2. 被创设对象的有着 成员变量
  • BSS 段 : 程序甘休后由系统释放

  • 数据段 : 程序甘休后由系统释放

  • 代码段:程序结束后由系统释放

    次第 编写翻译链接 后的二进制可实践代码

  1. 一部分变量是保留在栈区的
  2. 格局调用的实参也是保存在栈区的

2.1.3 其他

如果在程序中调用方法,会开启一个  " 栈帧 ".(这个栈帧可以理解为也是一块连续的区域)

栈帧的地址与之前的局部变量的地址不是连续的栈帧中记录实参地址,
以及方法内部的局部变量方法执行完毕后,栈帧销毁(弹栈)   

<<<这样每次执行完毕后,都弹栈释放内存,这样就会始终保证栈区占用的内存不会特别大>>

so-课外话->我们在开发的时候,如果每个方法都写的很短,同时每个方法声明的变量都很少.
这样做一定会节约内存

见图知意
图片 6

**加多 “在四个函数/方法中”

即在三个函数/方法中最多可定义65536,—>因为”每一回”施行完”八个”方法之后就能够弹栈释放内存**
图片 7

栈的概念:  后进先出/  先进后出

见图知意:

NSLog(@"NSInteger 变量占用的字节数 %tu", sizeof(NSInteger));
        NSLog(@"double 变量占用的字节数 %tu", sizeof(double));
        NSLog(@"xinge 变量占用的字节数 %tu", sizeof(xinge));

        // 提示:栈区中,只适合存储非常小的数据
        NSLog(@"在 iPhone 中,最多可以在一个函数/方法中定义 %zd 个局部变量", 512 * 1024 / 8);

        // 测试方法调用时,实参在栈区的存储情况
        [xinge sumWithNum1:i andNum2:j];        

总结:  调用方法时栈区的工作原理
        * 开启栈帧
        * 保存实参
        * 保存局部变量
        * 方法完成后弹栈,销毁栈帧,释放空间

02.栈区和堆区

int main(int argc, const char * argv[]) {

    // 局部变量是保存在栈区的
    // 栈区变量出了作用域之后,就会被销毁
    NSInteger i = 10;

    NSLog(@"%zd", i);

    // 局部变量是保存在栈区的
    // 赋值语句右侧,使用 new 方法创建的对象是保存在堆区的
    // xinge 变量中,记录的是堆区的地址
    // 在 OC 中,有一个内存管理机制,叫做 `ARC`,可以自动管理 OC 代码创建对象的生命周期
    // 因此,在开发 OC 程序的时候,程序员通常不需要考虑内存释放的工作
    LJXPerson *xinge = [LJXPerson new];
    NSLog(@"%@", xinge);
    return 0;
}

10 <LJXPerson: 0x100404b70>

  • 堆区 (heap [hiːp]):
    由程序猿分配释放,若程序员不自由,会现出内存泄漏

2.2 堆区

堆区 (heap [hiːp]): 由程序员分配释放,若程序员不释放,会出现内存泄漏
图片 8

2.1 栈区

栈区 (stack [stæk]) : 由编写翻译器自动分配释放

  1. 赋值语句左侧 使用 new 方法创造的对象
  2. 被创设对象的兼具 成员变量

2.2.1 堆区中保留:

  • 采纳 new 方法创制的对象保存在堆区
  • 被创造对象的富有成员变量保存在堆区中

堆区的职责是"解决栈区空间有限的问题"

* OC 使用`new`方法创建的对象
--->{由于 **ARC 管理机制**,OC 程序员通常不需要考虑对象的释放.}
  (在 OC 中,有一个内存管理机制,叫做 ARC(自动引用计数)
  可以自动管理 OC 代码创建对象的生命周期)
* C 语言使用 malloc、calloc、realloc 函数分配的空间,需要使用 free 函数释放

顾: 在开垦 OC 程序的时候,技士平日没有须要怀恋内部存款和储蓄器释放的劳作
但是:即便在 OC 的代码中,借使应用到 C
语言分配空间的函数,则需求思量释放内部存款和储蓄器

1. 堆区的大小由系统决定,包括:系统内存/磁盘交换空间...
2. 系统使用`链表`来管理堆区中的内存分配情况
3. {**程序员只需要负责堆区中内存的分配和释放工作**}

2.1.1 栈区中的保存(栈区的职分/存款和储蓄的内容)

  • 局部变量
  • 方法实参(eg:在main函数中,调用方法,方法中的实参)
  • BSS 段 : 程序截至后由系统释放

  • 数据段 : 程序甘休后由系统释放

  • 代码段:程序截止后由系统释放

    次第 编写翻译链接 后的二进制可实践代码

2.2.2可见揭露堆区的特点

2.1.2 栈区的特色

  • 存储空间有限 . iphone的栈区大小独有512k(默许) ,非常轻巧
  • 连续性 . 栈区的地点是接二连三的
    图片 9

部分代码:
#import <Foundation/Foundation.h>
#import "LJXPerson.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSInteger i = 10;
        NSLog(@"i 的栈区地址是 %p", &i);

        NSInteger j = 10;
        NSLog(@"j 的栈区地址是 %p", &j);

        // xiaoming 变量中,存储的是 LJXPerson 
        对象的内存地址(堆区的内存地址)
        LJXPerson *xinge = [LJXPerson new];
        NSLog(@"xinge 的栈区地址是 %p", &xinge);

        double height = 10;
        NSLog(@"height 的栈区地址是 %p", &height);
        .......

i 的栈区地址是 0x7fff5fbff768 j 的栈区地址是 0x7fff5fbff760 xinge 的栈区地址是 0x7fff5fbff758 height 的栈区地址是 0x7fff5fbff750

  • 地址分配从大到小. 栈区地址遵照分配的逐个,由大到小顺序排列
  • 访问速度快.
  • 系统管理. (栈区的内部存款和储蓄器由系统管理)

0.3 全局变量、静态变量和常量

2.1.3 其他

如果在程序中调用方法,会开启一个  " 栈帧 ".(这个栈帧可以理解为也是一块连续的区域)

栈帧的地址与之前的局部变量的地址不是连续的栈帧中记录实参地址,
以及方法内部的局部变量方法执行完毕后,栈帧销毁(弹栈)   

<<<这样每次执行完毕后,都弹栈释放内存,这样就会始终保证栈区占用的内存不会特别大>>

so-课外话->我们在开发的时候,如果每个方法都写的很短,同时每个方法声明的变量都很少.
这样做一定会节约内存

图片 10
图片 11

见图知意
图片 12

**增添 “在贰个函数/方法中”

即在二个函数/方法中最多可定义65536,—>因为”每趟”施行完”多少个”方法之后就能够弹栈释放内部存储器**
图片 13

栈的概念:  后进先出/  先进后出

见图知意:

NSLog(@"NSInteger 变量占用的字节数 %tu", sizeof(NSInteger));
        NSLog(@"double 变量占用的字节数 %tu", sizeof(double));
        NSLog(@"xinge 变量占用的字节数 %tu", sizeof(xinge));

        // 提示:栈区中,只适合存储非常小的数据
        NSLog(@"在 iPhone 中,最多可以在一个函数/方法中定义 %zd 个局部变量", 512 * 1024 / 8);

        // 测试方法调用时,实参在栈区的存储情况
        [xinge sumWithNum1:i andNum2:j];        

图片 14

总结:  调用方法时栈区的工作原理
        * 开启栈帧
        * 保存实参
        * 保存局部变量
        * 方法完成后弹栈,销毁栈帧,释放空间
int main(int argc, const char * argv[]) { // 局部变量是保存在栈区的 // 栈区变量出了作用域之后,就会被销毁 NSInteger i = 10; NSLog(@"%zd", i); // 局部变量是保存在栈区的 // 赋值语句右侧,使用 new 方法创建的对象是保存在堆区的 // xinge 变量中,记录的是堆区的地址 // 在 OC 中,有一个内存管理机制,叫做 `ARC`,可以自动管理 OC 代码创建对象的生命周期 // 因此,在开发 OC 程序的时候,程序员通常不需要考虑内存释放的工作 LJXPerson *xinge = [LJXPerson new]; NSLog(@"%@", xinge); return 0;}

发表评论

电子邮件地址不会被公开。 必填项已用*标注