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的回调传值的过程不是很理解的话,建议使用代理。可以达到同样地效果。