Block详解

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转自李峰峰博客 一、概述 闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」...
    Joshua520阅读 1,038评论 0 0
  • 1、概述 闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」;Block 是...
    DeerRun阅读 693评论 0 0
  • 1、block简介 block字面意思就是代码块 iOS4.0 Apple引入的特性 block是Objectiv...
    呆子四二阅读 1,625评论 1 6
  • 毫不夸张地说,block让objc这门语言变得更有魅力,它就是在其它语言中常见的闭包的概念。在block之前,ob...
    myzhing阅读 418评论 0 0
  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 3,791评论 0 23