Block介绍

  Block在ios 4.0之后加入,并大量使用在新的ios api中。block是一个匿名的代码块,可以传递给其他对象的参数,并得到返回值。从本质上讲,block同其他普通的变量类似,只是其储存的数据是一个函数体。Block不只是针对Objective-C的专利,而是一种可以应用于C、C++和OBjective-C的语言层面的新特性。通过使用block,开发者可以将一段代码段像某一个数值一样当做参数传递给函数。同时,blocks也是Objective-C的一种对象,可以像其他对象一样添加到NSArray或者NSDictionary等集合中。

  • 块语法,本质上是匿名函数。与函数指针很相似
  • Block封装了一段代码,可以在任何时候执行
  • Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。

Block基本使用

1> 如何定义block变量

int (^sumBlock)(int, int);

 void (^myBlock)();

 int (^myBlock)(int) = ^(int num){ return num *multiplier };

2> 如何利用block封装代码

 ^(int a, int b) {

    return a - b;

 };

 ^() {

    NSLog(@"----------");

 };

 ^ {

    NSLog(@"----------");

 };

3> block访问外面变量

  * block内部可以访问外面的变量

  * 默认情况下,block内部不能修改外面的局部变量

  * 给局部变量加上__block关键字,这个局部变量就可以在block内部修改

  * 给局部变量加上static关键字,这个局部变量就可以在block内部修改

4> 利用typedef定义block类型

 typedef int (^MyBlock)(int, int);

 // 以后就可以利用MyBlock这种类型来定义block变量

 MyBlock block;

 MyBlock b1, b2;

 b1 = ^(int a, int b) {

    return a - b;

 };

 MyBlock b3 = ^(int a, int b) {

    return a - b;

 };

Block使用的细节和本质

1.block实际上是指向结构体的指针

2.编译器会将block的内部代码生成对应的函数

Block的内存管理 

1.默认情况下, block的内存是在栈中

* 它不会对所引用的对象进行任何操作

2.如果对block做一次copy操作, block的内存就会在堆中

* 它会对所引用的对象做一次retain操作

* 非ARC : 如果所引用的对象用了__block修饰, 就不会做retain操作

* ARC : 如果所引用的对象用了__unsafe_unretained\__weak修饰, 就不会做retain操作

  这里有一篇个人比较喜欢的关于Block内存管理文章,有兴趣研究的可以看看:Block 的内存管理

Block使用注意

1、在使用block前需要对block指针做判空处理。

  不判空直接使用,一旦指针为空直接产生崩溃。

if (!self.isOnlyNet) {

    if (succBlock == NULL) { //后面使用block之前要先做判空处理

        return;

    }

    id data = [NSKeyedUnarchiver unarchiveObjectWithFile:[self favoriteFile]];

    if ([data isKindOfClass:[NSMutableArray class]]) {

        succBlock(data,YES);

    }else{

        succBlock(nil,YES);

    }

}

2、使用方将self或成员变量加入block之前要先将self变为__weak

3、在多线程环境下(block中的weakSelf有可能被析构的情况下),需要先将self转为strong指针,避免在运行到某个关键步骤时self对象被析构。

__weak __typeof(self)weakSelf = self;

AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) {

    __strong __typeof(weakSelf)strongSelf = weakSelf;

    strongSelf.networkReachabilityStatus = status;

    if (strongSelf.networkReachabilityStatusBlock) {

        strongSelf.networkReachabilityStatusBlock(status);

    }

};

Block使用场景

(待完成)

Block的妙用

(待完成)

利用Block实现链式编程 

(待完成)

Block总结

(待完成)

iOS中Block使用探索的更多相关文章

  1. iOS中block的用法 以及和函数用法的区别

    ios中block的用法和函数的用法大致相同 但是block的用法的灵活性更高: 不带参数的block: void ^(MyBlock)() = ^{}; 调用的时候  MyBlock(); 带参数的 ...

  2. iOS 中Block以及Blocks的使用,闭包方法调用

    OC: -(void)dataWithUrl:(NSString*)string AndId:(NSInteger)id returnName:(void(^)(NSString*name))back ...

  3. iOS中block类型大全

    iOS中block类型大全 typedef的block 作为属性的block 作为变量的block 作为方法变量入参的block 作为方法参数的block 无名block 内联函数的block 递归调 ...

  4. iOS中Block介绍(一)基础

    ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发.讨论范围:block的使用,内存管理,内部实现.不包含的内容:gc arc下的block内存,block在c++中 ...

  5. iOS中Block介绍 基础

    ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发.讨论范围:block的使用,内存管理,内部实现.不包含的内容:gc arc下的block内存,block在c++中 ...

  6. IOS中block和代理

    从ios4开始引入block,就是代码块,结构类c语言 基本结构 返回值 (^block名称)(参数):int(^BlockName)(int):返回值为int型,参数是一个int值的叫BlockNa ...

  7. iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)

    1. 前言 Block:带有自动变量(局部变量)的匿名函数.它是C语言的扩充功能.之所以是拓展,是因为C语言不允许存在这样匿名函数. 1.1 匿名函数 匿名函数是指不带函数名称函数.C语言中,函数是怎 ...

  8. iOS中Block循环引用的问题

    说到循环引用问题,想必大家都碰到过吧,比如在使用Block的时候,使用__weakSelf来代替self解决等,但是对于这个,还是有不少可以探索的点,下面我就来说下,希望对大家有所帮助. 是否所有的B ...

  9. iOS 中block中使用了外部变量的分析

    例子1: ; void (^blk)(void) = ^(){ printf("in block %d[%p]\n", val, &val); //in block 10[ ...

随机推荐

  1. iOS开发 Date转字符串

    + (NSString *)formatterDate:(NSNumber *)desDate WithDateFormatter:(NSString *)formatter{ NSDateForma ...

  2. chrome web开发工具

    顾名思义Chrome开发工具就是一个工具,它允许Web开发人员可以通过浏览器应用程序干预和操作Web页面,也可以通过这个工具调试和测试Web页面或Web应用程序.有了这个工具,你可以做很多有趣的事情: ...

  3. 能在CAD2004以下版本里面打开2007以上版本文件的外挂

    下载地址:http://yunpan.cn/cjrxMKNubXQ5E  访问密码 1974 老何CAD工具安装办法:[推荐]先安装老何工具箱,然后用[扩展添加老何cad下拉菜单.bat]就完成老何下 ...

  4. jq实现多级手风琴效果

    /*左侧*/ .wrapper, .main { height: 100%; z-index: 9 } .main { position: relative; } .main_L { width: 2 ...

  5. python 练习 14

    方法一 #!/usr/bin/python # -*- coding: UTF-8 -*- def fib(n): a,b = 1,1 for i in range(n-1): a,b = b,a+b ...

  6. 七天学会NodeJS (原生NodeJS 学习资料 来自淘宝技术团队)

    NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. ...

  7. js二级导航

    js写二级导航要点 1.ul li 2.js获取元素 3.setInterval(function(),time); 代码如下 <style type="text/css"& ...

  8. hadoop分布式的环境搭建

    版本: 使用hadoop1.1.2    JDK为java7 1.下载hadoop 2.配置hadoop文件 3测试 1.下载hadoop: 1.1 在https://archive.apache.o ...

  9. Tengine vs openresty

      简介 Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到 ...

  10. MATLAB画ROC曲线,及计算AUC值

    根据决策值和真实标签画ROC曲线,同时计算AUC的值 步骤: 根据决策值和真实标签画ROC曲线,同时计算AUC的值: 计算算法的决策函数值deci 根据决策函数值deci对真实标签y进行降序排序,得到 ...