标签:block 闭包 block的使用 ios objective-c
看了两天的Block。网上是有很多讲解与教程,也有讲得很好的。这里就主要讲解下我的理解与收获,欢迎拍砖。
所谓block,我认为应该是一个闭包函数。而闭包,就是说block以及内部所有的变量生命周期都在其调用函数的生命周期内。它一被调用完成,则会被立马释放。这里不讲运行机制,只简要地讲主要的使用方法(这里所讲是基于ARC的环境下)。
其定义方式跟函数还是很类似的。为了简便理解我们对比下block与函数的定义,先看一下最简单的形式,无返回值带参。先看Block直接放在函数体内的形式:
函数:
- (void)printBlock:(NSString *)output {
NSLog(@"output == %@", output);
}
Block直接放在函数体内的形式:
void(^printBlock)(NSString *) = ^(NSString *output)
{
NSLog(@"output == %@", output);
};
这里可以看到,我们的函数体一般形式是:
- (返回值) 函数名: (形参)...
调用形式是:[调用对象 函数名(形参)];
那我们放在函数体内的Block定义则是:
返回值 (^ Block名)( 形参 ) = ^( 形参 ){ //实现内容 };
调用形式是 :Block名(形参);
这里的Block就相当于是一个内嵌函数。声明与实现要同时放在一起。形式就很像我们平常使用的对象赋值一样:id obj = ... ;
定义与使用方法都与上面一致,只不过就像局部变量与类变量一样是否可被其他方法调用而已。为了更简单明了我们可以看一下这个代码:
//普通方法定义
- (void)printBlock:(NSString *)output {
NSLog(@"output == %@", output);
}
//函数体外的Block
void(^printBlock)(NSString *) = ^(NSString *output)
{
NSLog(@"output == %@", output);
};
//Block调用
- (void)printSomething {
printBlock(@"I‘m printBlock");
}
头文件中的定义(1):
typedef void(^printBlockClass)(NSString *);
@interface BlockClass : NSObject
@property (nonatomic, copy)printBlockClass print;
@end
//或者在实现文件中:
//但这种实现在内部的Block我也不知道有什么卵用。实际应用不大。
@interface BlockClass : NSObject
{
printBlockClass print;
}
@end
头文件中的定义(2):
//与方式一的区别无非像是自定义一种结构然后你再去使用一样
@interface BlockClass : NSObject
@property (nonatomic, copy) void(^printBlockClass)(NSSting *output);
@end
这种把Block作为属性的情况是比较多用于页面传值中。
关于Block的使用还有一下几个注意点:
1、只有在调用Block的时候才会执行{}内部的代码(就比如把Block定义在函数体内不调用是不会执行的)。
2、在Block的{}内部代码中是对外部的变量可以引用,但不能改变。如果试图更改会产生一个编译器错误。除非你把想要更改的变量声明时加上 __block关键字。
3、在block使用过程要注意不要产生循环引用。
关于循环引用(Memory Recycle)这里有一篇文章写得不错。有兴趣可以看看:http://blog.csdn.net/fengsh998/article/details/38090205
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:block 闭包 block的使用 ios objective-c
原文地址:http://blog.csdn.net/cnlf14/article/details/47083133