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. python剑指网络

    >>> #获取hostname ... >>> host_name=socket.gethostname() >>> print "%s ...

  2. idea14教程

    破解:http://blog.csdn.net/guofeng526/article/details/47043457 使用教程: http://www.phperz.com/article/15/0 ...

  3. phalcon: (非官方)简单的多模块

    phalcon: [非官方]多模块 配合router使用 例如:我的模块叫做: home 入口文件增加引入: use Phalcon\Mvc\Router; 在自动引入前面增加,自动引入命名空间: / ...

  4. 树 - 从零开始实现by C++

    参考链接:数据结构探险之树篇

  5. assert的用处

    ASSERT函数是用于调试中,也就是说在你的代码中当是Debug的时候它完成对参数的判断,如果是TRUE则什么都不做,如果是FALSE则弹出一个程序中断对话框提示程序出现错误.在Release版本中它 ...

  6. 记一次基于Unity的Profiler性能分析

    A. WaitForTargetFPS: Vsync(垂直同步)功能所,即显示当前帧的CPU等待时间    B. Overhead:       Profiler总体时间-所有单项的记录时间总和.用于 ...

  7. 打开Eclipse时出现"The Eclipse executable launcher was unable to locate its companion shared library"情况的解决办法

    在网上有坑,各种解决方法都有,但似乎我这台64位机器不太给面子,都不能解决: 结果自己找到了解决办法,总结了一下,大多数软件出问题,如果卸载了重新装还是出现问题,一般都是注册表残留的问题: 将ecli ...

  8. MySQL for Windows 解压缩版配置安装

    1.MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将会安装在C: ...

  9. python3.x随手笔记2

    对象,价值观和类型 对象 Python的抽象的数据. 所有的数据在一个Python程序 表示对象或对象之间的关系. (在某种意义上,在 符合冯诺依曼模型的代码也“存储程序计算机” 由对象.) 每一个对 ...

  10. sql server 导出数据到 Azure Hbase / Hive 详细步骤

    The Hadoop on Azure Sqoop Import Sample Tutorial Table of Contents   Overview   Goals Key technologi ...