Block的一些简单理解
2016-03-09 16:49
453 查看
这是我在网上学习block的时候搜索到的博文代码,加入了一些自己的粗浅理解:
开始引了框架的头文件
#import <Foundation/Foundation.h>
在这里用typedef 定义了一个叫做compareBlock,返回值为int类型参数为int a,int b的Block
typedef int(^compareBlock)(int a, int b);
@interface HBTestBlock : NSObject
下面定义了2个Block的属性,一个是通过已定义的Block修饰的的Block属性,一个是新建的Block属性
@property(nonatomic, copy) compareBlock compare;
@property(nonatomic, copy) UIView *(^viewGetter)(NSString *imageName); //注意其返回类型为UIView
*
@end
下面这两个函数,展示的是如何在其他的类中,使用这两个属性。
#pragma mark 测试对象的属性为block
- (void)testObjPropertyBlock
{
下面是创建一个HBTestBlock的实例对象,不明白为什么不直接用self,而是实例化一个对象在调用viewGetter的属性
HBTestBlock *objPropertyBlockObj = [[HBTestBlock alloc] init];
下面是调用Block属性并给这个Block属性赋值。
注意:只是单纯的赋值,并没有调用。这个地方我认为是理解Block属性的一个关键地方
因为viewGetter的Block类型已经定义完毕了,所以它的右边赋值对象也必须是一个同类型的Block,
objPropertyBlockObj.viewGetter = ^(NSString *imageName){
// return [[UIView alloc] init]; //特别注意此处,若对象不匹配,则会报错,设置为nil也会报错。
调用currentView方法,返回UIView类型
return [self currentView];
};
这里才是调用,输入了参数(@"hello"
objPropertyBlockObj.viewGetter(@"hello"); //实际执行block
}
单纯的方法
- (UIView *)currentView
{
NSLog(@"now I am in currentView");
return nil;
}
这个跟上面的差不多,都是一个意思
- (void)testPropertyBlock
{
HBTestBlock *properBlockObj = [[HBTestBlock alloc] init];
这里也是给Block的属性赋值,因为被Block修饰compare是一个参数为int a, int b返回值是int类型的Block,所以右边也必须是这样的,跟上面的一个意思
properBlockObj.compare = ^(int a,int b)
{
int result = [self maxer:a another:b];
NSLog(@"the result is %d",result);
return result;
};
下面是调用
NSLog(@"the properBlockObj.compare is %d",properBlockObj.compare(100,200));
}
- (int)maxer:(int)a another:(int)b
{
if (a > b) {
return a;
}
return b;
}
开始引了框架的头文件
#import <Foundation/Foundation.h>
在这里用typedef 定义了一个叫做compareBlock,返回值为int类型参数为int a,int b的Block
typedef int(^compareBlock)(int a, int b);
@interface HBTestBlock : NSObject
下面定义了2个Block的属性,一个是通过已定义的Block修饰的的Block属性,一个是新建的Block属性
@property(nonatomic, copy) compareBlock compare;
@property(nonatomic, copy) UIView *(^viewGetter)(NSString *imageName); //注意其返回类型为UIView
*
@end
下面这两个函数,展示的是如何在其他的类中,使用这两个属性。
#pragma mark 测试对象的属性为block
- (void)testObjPropertyBlock
{
下面是创建一个HBTestBlock的实例对象,不明白为什么不直接用self,而是实例化一个对象在调用viewGetter的属性
HBTestBlock *objPropertyBlockObj = [[HBTestBlock alloc] init];
下面是调用Block属性并给这个Block属性赋值。
注意:只是单纯的赋值,并没有调用。这个地方我认为是理解Block属性的一个关键地方
因为viewGetter的Block类型已经定义完毕了,所以它的右边赋值对象也必须是一个同类型的Block,
objPropertyBlockObj.viewGetter = ^(NSString *imageName){
// return [[UIView alloc] init]; //特别注意此处,若对象不匹配,则会报错,设置为nil也会报错。
调用currentView方法,返回UIView类型
return [self currentView];
};
这里才是调用,输入了参数(@"hello"
objPropertyBlockObj.viewGetter(@"hello"); //实际执行block
}
单纯的方法
- (UIView *)currentView
{
NSLog(@"now I am in currentView");
return nil;
}
这个跟上面的差不多,都是一个意思
- (void)testPropertyBlock
{
HBTestBlock *properBlockObj = [[HBTestBlock alloc] init];
这里也是给Block的属性赋值,因为被Block修饰compare是一个参数为int a, int b返回值是int类型的Block,所以右边也必须是这样的,跟上面的一个意思
properBlockObj.compare = ^(int a,int b)
{
int result = [self maxer:a another:b];
NSLog(@"the result is %d",result);
return result;
};
下面是调用
NSLog(@"the properBlockObj.compare is %d",properBlockObj.compare(100,200));
}
- (int)maxer:(int)a another:(int)b
{
if (a > b) {
return a;
}
return b;
}
相关文章推荐
- 第二周项目3-小试循环
- js设计模式--鸭子类型
- sublime C++ build system配置体验
- HeadFirst设计模式之工厂模式
- Objective-C语法-基本数据类型
- Bootstrap—后台框架Ace
- Chart 实例
- iOS中RunLoop机制浅探
- tomcat服务器重启后session可以继续使用配置方法
- 【python】编程语言入门经典100例--33
- NSArray 数组操作
- 表视图去掉某一行的分割线
- 数学之美6
- Dynatrace Ajax Editon性能分析
- UISearchController - 搜索控制器
- 如何决定 Web 应用的线程池大小
- CodeForces#1B Spreadsheets
- 按下鼠标时显示密码
- (原)使用 memcache 使用过程中可能遇到的问题
- mysql 数据库主从同步配置