block块

Block比之C函数,其灵活性体现在栈内存、堆内存的引用。

Block是苹果推荐的类型,效率高,可以帮助我们组织独立的代码段,并提高复用性和可读性。主要是用来在运行中封装代码和保存代码用的。

Block可以在任何时候被执行。

和c语言的比较:

1、可以保存代码。

2、有返回值。

3、有参数

4、调用方式一样



只要遵循一条原则:代码是从上到下执行的,先定义后使用


最简单地理解:block就是一个用来保存代码的变量,可以在你需要的使用的时候通过block 来使用你保存的代码,通常用来做并发任务、遍历、以及回调。

格式说明:

(返回类型)(^块名称)(参数类型列表) = ^(形参列表) {代码实现};

如果没有参数,等号后面参数列表的()可以省略

void(^Myblock)() = ^{

NSLog(@"这个是Myblock");

};

// 这个是定义了一个函数的指针并赋值

void (*Mytest)() = test;

// 调用函数

Mytest();

// 调用block

Myblock();


在系统函数中使用代码块的部分情况

a. 遍历数组和字典

b. 排序

c. 视图动画

d. 结束回调

e. 错误处理

f. 多线程等



typedef void(^eBlock)();

/**

-以下代码在ARC中有问题吗?=》没有问题

-在MRC中有问题吗?存在内存隐患,i和b都是局部变量,出了作用域就会被释放

解决问题:

-返回前使用    Block_copy

-使用后,使用  Block_release

网上错误答案 return [b copy];

*********

Product - Analyze (静态分析)

从代码结构上分析是否存在缺陷!本身并不会运行程序!并不能够检测到真正的内存泄漏!

但是:只要是静态分析工具发现的问题,通常都是需要提升的代码!

静态分析工具,是MRC开发时的利器!提前发现内存隐患!

另外,在ARC开发时,如果程序要上架之前,建议使用静态分析工具检测一下,通常可以发现一些不注意的警告,有助于提升代码质量!尤其在使用到C语言框架的代码!

*/

eBlock myBlock() {

int i = 10;

eBlock b = ^ {

NSLog(@"hello %d", i);

};

// 利用Block_copy将block以及内部的变量拷贝到堆中

return Block_copy(b);

}

int main(int argc, const char * argv[]) {

@autoreleasepool {

eBlock bb = myBlock();

bb();

// 释放堆中block

Block_release(bb);

}

return 0;

}

* 1

* 2

* 3

* 4

* 5

* 6

* 7

* 8

* 9

* 10

* 11

* 12

* 13

* 14

* 15

* 16

* 17

* 18

* 19

* 20

* 21

* 22

* 23

* 24

* 25

* 26

* 27

* 28

* 29

* 30

* 31

* 32

* 33

* 34

* 35

* 36

* 37

* 38

* 39

* 40

* 41

* 42

* 43

* 44

* 45

* 46

* 47

6、block循环引用问题的解决

循环引用的结果就是导致对象无法释放。

我们测试的最好的办法是在对象中重写dellac方法,看这个方法是否被调用。没有调用说明存在循环引用。

在我们的IOS开发当中,什么时候会出现循环引用:

在我们使用block的时候,如果block中使用到了self ,这个时候就需要关心循环引用的问题。

解决方案:__weak typeof(self) weakSelf = self;

// 示例代码SDWebImage 框架使用的使用用的代码:

__weak typeof(self) weakSelf = self;

SDWebImageManager *manage = [SDWebImageManager sharedManager];

[manage downloadImageWithURL:url options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {

if (finished) {

// 这里是用 weakSelf 代替self 避免循环引用

[weakSelf setupImageFrame: image];

}

}];

* 1

* 2

* 3

* 4

* 5

* 6

* 7

* 8

* 9

注意点:并不是所有的block中使用self都会有循环引用的问题。为了避免循环引用的问题,遇到block中用到self 。我们都这么写,就可以避免循环引用的问题。

7、代理和block在使用的时候我们是怎么选择的。

委托和block是IOS上实现回调的两种机制。Block基本可以代替委托的功能,而且实现起来比较简洁,比较推荐能用block的地方不要用委托。

单就编程过程而言,block对开发者处理逻辑,编程效率,代码阅读都有积极影响。

代理是一种很金典的模式,我们很多人都已经习惯了这种模式,若果对block的回调传值的过程不是很理解的话,建议使用代理。可以达到同样地效果。

你可能感兴趣的:(block块)