美文网首页
iOS开发笔记-block

iOS开发笔记-block

作者: 鹏雨燕 | 来源:发表于2019-02-23 15:55 被阅读0次

    先了解下C语言中数据存储的四个区域,

    • 代码区:
      程序代码指令,define定义的常量。

    • 静态区:
      全局(关键)变量/常量,静态(关键)变量/常量,常量字符串(external,static)静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配。

    • 栈区:
      局部变量,栈区上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁。其特点是效率高,但空间大小有限。

    • 堆区:
      由malloc或者realoc,calloc分配的内存区域,堆区其生命周期由free决定。

    #include<stdio.h>
    #include<stdlib.h>
    
    //程序代码指令,define定义的常量---代码区(只读)
    //全局(关键)变量/常量,静态(关键)变量/常量,常量字符串---静态区
    //静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配。
    //局部变量---栈区
    //栈区上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁。其特点是效率高,但空间大小有限。
    //由malloc或者realoc,calloc分配的内存区域---堆区
    //堆区其生命周期由free决定。
    
    
    #define PI 3.14   //
    
    //全局变量
    int a = 10;
    int b[5] = { 1, 2, 3, 4, 5 };
    int const c = 2;
    
    void run2();
    
    void main(){
        int num = 10;
        //对于int num = 10;的理解
        //int 数据类型 编译器预算对象(变量)num分配4个字节内存空间大小
        //num是内存中一段内存空间的标识(相当于门牌号),
        //10 才是存储在这段内存空间里的数据
        //详细的来说,“int num=10;”这段字符存储在代码区,数据10存储在栈区
    
        //验证局部常量是否存储在栈区
        run2();
        //经过内存观察,开始局部常量cde的内存空间的数据是2
        //当run2()函数执行完毕,局部常量cde的内存空间的数据发生变化
        //因为静态区的内容在总个程序的生命周期内都存在,所以判断局部常量存储在栈区
    
    
        char *p = "asdfadsf";//"asdfadsf"是字符串常量,在静态区,只读
        //指针p是临时变量,在栈区
        //验证 "asdfadsf" 只读
        //*p = 'a';//编译不报错
        printf("%s\n", p);//运行报错--“写入位置 0x001B692C 时发生访问冲突。”,由此证明"asdfadsf"是字符串常量,只读
    
        //堆只能是malloc或者realoc,calloc,分配的内存才是堆
        //例如以下代码
        void *p1 = malloc(sizeof(int)* 1024);//malloc(sizeof(int)* 1024);分配的内存就是堆区,但是指针p1是在栈区
        //堆的使用情况:①无法确定需要内存的大小;②需要的内存很大
        //堆的注意点:堆和栈不同,堆的内存大小是由程序员分配的,必须由程序员手动释放(free(p1););
        //对于栈来说,栈的内存大小由系统分配(栈的极限大约是1M,非常小),所以栈的内存空间是由系统回收的
    
        //堆的内存大小是由程序员分配的,理论上可以占据系统中所有的内存(甚至能抢占栈的内存空间)
        //因为栈的内存空间是由系统回收的,所有在回收的时候会消耗大量的cpu
        char d = 'a';//变量d的数据在栈区中
    
        system("pause");
    }
    
    //run1是程序代码,所以存储在代码区
    void run1(){
        while (1){
            int x = 0;//x变量的内存空间在栈区,因为while循环,x每次循环都会初始化,所以系统不断的在栈上创建x的内存空间,回收x的内存空间,会消耗大量的cpu
            printf("%d", x);
        }
    }
    
    void run2(){
        const cde = 2;//变量cde的数据在栈区,与cde是否是常量没关系
        printf("%x\n",&cde);//获取cde的地址,检测run2()函数在main()执行完成之后,系统是否会回收cde指向的内存空间
    }
    
    int add(int a, int b){//形参a,b是临时变量,形参a,b的数据存储在栈区
        return a + b;//a+b的操作会在寄存器中执行
    }
    

    iOS中的block创建时有几种类型,

    • _NSConcreteStackBlock // 存储在栈上
    • _NSConcreteGlobalBlock // 存储在数据段
    • _NSConcreteMallocBlock // 存储在堆上

    相关文章

      网友评论

          本文标题:iOS开发笔记-block

          本文链接:https://www.haomeiwen.com/subject/qljpyqtx.html