美文网首页
Block详解

Block详解

作者: leonardni | 来源:发表于2017-11-17 16:17 被阅读10次

    block


    一、前期准备知识

    1.1 堆与栈基本概念
    1.2 终端与clang编译常用命令

    1.1 堆与栈简介:

    1. 栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
    2. 堆区(heap)- 般由程序员分配释放,若程序员不释放,程序结束时可能由OS(即操作系统)回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

    例子:

    //main.cpp    
      int   a   =   0;   全局初始化区    
      char   *p1;   全局未初始化区    
      main()    
      {    
      int   b;   栈    
      char   s[]   =   "abc";   栈    
      char   *p2;   栈    
      char   *p3   =   "123456";   123456/0在常量区,p3在栈上。    
      static   int   c   =0;   全局(静态)初始化区    
      p1   =   (char   *)malloc(10);    
      p2   =   (char   *)malloc(20);    
      分配得来得10和20字节的区域就在堆区。    
      strcpy(p1,   "123456");   123456/0放在常量区,编译器可能会将它与p3所指向的"123456"  
      优化成一个地方。    
      }    
    

    除此之外还有全局区、文字常量区、程序代码区。具体见这篇文章堆和栈的区别(转过无数次的文章)
    这里就不扩展开了。

    1.2 终端与clang编译常用命令

    1.2.1 终端打开方式:

     `LaunchPad -> 其他 -> 终端`
    
    WX20171117-160257@2x.png

    1.2.2 clang编译常用命令

    (1) Clang重写m文件为cpp文件

    image.png
    cd 到工程目录然后输入clang -rewrite-objc xxxx.m
    然后你目录下就会从写一个cpp文件,内容比较多你可以搜索关键方法对照查看。
    详细的clang编译介绍可以看下这篇文章深入剖析 iOS 编译 Clang / LLVM

    注意事项

    block 官方介绍


    QQ20171118-152029@2x.png
    QQ20171118-152918@2x.png

    Block在MRC及ARC下的内存管理

    iOS 底层解析weak的实现原理(包含weak对象的初始化,引用,释放的分析)

    • 在Block的内存存储在栈中时,如果在Block中引用了外面的对象,不会对所引用的对象进行任何操作
    • 如果对Block进行一次copy操作,那么Block的内存会被移动到堆中,这时需要开发人员对其进行release操作来管理内存
    • 如果对Block进行一次copy操作,那么Block的内存会被移动到堆中,在Block的内存存储在堆中时,如果在Block中引用了外面的对象,会对所引用的对象进行一次retain操作,即使在Block自身调用了release操作之后,Block也不会对所引用的对象进行一次release操作,这时会造成内存泄漏。

    处理方法:


    image.png
    • 如果对象内部有一个Block属性,而在Block内部又访问了该对象,那么会造成循环引用,解决循环引用的办法是在对象的前面使用下划线下划线block来修饰,以避免Block对对象进行retain操作

    参考文献:
    Blocks Programming Topics
    A Short Practical Guide to Blocks

    相关文章

      网友评论

          本文标题:Block详解

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