使用场景
- block代码块保存在对象属性之中,等到时机成熟调用(外界界定block内容,block外部调用)
- 当做方法的参数使用(外界决定block内容,block方法内部调用,刚开始学的时候一直想不通系统的block作为参数的使用)
- 当做方法的返回值,用于代替方法(block内容由方法内部实现,外部调用block)
定义一个Person类
#import <Foundation/Foundation.h>
@interface Person : NSObject
typedef void(^BlockType)();
//声明了一个block属性
//在ARC使用strong,非ARC使用copy
@property (nonatomic, strong) void(^operation)() ;
//void(^)()表示block类型
- (void)run:(BlockType)block;
- (void)eat:(void(^)())block;
//void(^operation)()作为属性:相当于类型+名字->就是block的声明: returnType(^blockName)(parameterTypes)
//(void(^)())block作为参数: 类型+名字
//block当做返回值使用,目的就是代替方法,block方法的定义是由这个方法内部决定的,我们不知道,不同于block作为参数使用:block的定义由外部决定。
- (void(^)())work;
@end
#import "Person.h"
@implementation Person
- (void)run:(BlockType)block {
//block当做参数适用,方法内部调用block
block();
}
- (void)eat:(void (^)())block {
//block的内部调用实例:就是block当做参数使用,这时候在方法的内部调用block。
block();
}
- (void (^)())work {
return ^() {
NSLog(@"work hard,好好学习,天天向上");
};
}
@end
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
/**
* block的声明:
* returnType:返回值类型
* blockName:名字
* parameterTypes:参数
* block的定义:
* parameters:参数
*/
// <#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
// <#statements#>
// };
/*
void(^)() ——>block类型 等同于 typedef void(^BlockType)();此时参数类型就是:void(^)()或者BlockType
void(^ blockName)() ——>block的声明
^(parameters) {
//code
};block的定义
blockName(); block的调用
*/
/*
block的使用场景:
1.作为对象的属性,等到时机的时候赋值block定义,block方法调用(block外部调用)
2.作为方法的参数,对象调用方法,传入block进去 (block内部调用)
3.当做方法的返回值,用于代替方法(block内容由方法内部实现,外部调用block)
*/
//block的声明和定义
void(^block)() = ^() {
NSLog(@"block代码块调用了");
};
//block的调用
block();
Person *p = [[Person alloc] init];
//block保存在对象属性中,等到时机在调用
void(^operationBlock)() = ^() {
NSLog(@"operationBlock调用");
};
// p.operation = ^() {
// NSLog(@"person的operation操作");
// };
p.operation = operationBlock;
//调用block
p.operation();
//block当做参数使用/block的内部调用
[p eat:^{
NSLog(@"eat");
}];
void (^runBlock)() = ^() {
NSLog(@"run");
};
[p run:runBlock];
//当做方法的返回值,用于代替方法(block内容由方法内部实现,外部调用block)
//block作为方法的返回值使用,有点像个方法的样子
// p.work首先返回void(^)()类型的block假设叫(blockName==p.work),然后调用(blockName() == p.work()调用block方法 )
p.work();
}
网友评论