创建了一个Person类作为测试用。
Person.h
#import <Foundation/Foundation.h>
typedef void(^blki)();
typedef int(^blkia)(int, int);
@interface Person : NSObject
@property (nonatomic,copy) void(^blkname)(void);
-(void)eat:(void(^)())blknameb;
-(void)walk:(int(^)(int,int))blkwalk;
-(void)beat:(blki)bi;
-(int)beata:(blkia)bia;
@end
Person.m
#import "Person.h"
@implementation Person
//-(void)eat:(void(^)(void))blockName{
//
// myBlock();
//}
-(void)eat:(void(^)())blknameb{
blknameb();
NSLog(@"This is a Person's class");
}
-(void)walk:(int(^)(int,int))blkwalk{
int ld = 0;
ld = blkwalk(3,4);
NSLog(@"The person's speed is %d", ld);
NSLog(@"Is this ok?");
}
-(void)beat:(blki)bi {
bi();
NSLog(@"Here is set for block M");
}
-(int)beata:(blkia)bia{
int beataa = bia(33,2);
return beataa;
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
声明一个blocka变量
//void(^blocka)(void);
声明一个blockb变量-
//int(^blockb)(int num1,int num2);
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
//blocka - 定义并初始化一个block
void(^blocka)(void) = ^void(){
NSLog(@"This is block a");
};
blocka();
//blockb -不省略返回值 -返回一个整数
int(^blockb)(int,int) = ^int(int num1, int num2){
int sum = 0;
sum = num1 + num2;
return sum;
};
NSLog(@"The Block b is %d", blockb(2,4));
//blockc - 不省略返回值-返回一个字符串- 无参数
NSString*(^blockc)(void) = ^NSString*(){
NSString *blockcStr = @"This is block c";
return blockcStr;
};
NSLog(@"%@", blockc());
//blockd - 省略返回值 -整数
int(^blockd)(int,int) = ^(int inputa, int inputb){
return inputa * inputb;
};
NSLog(@"THe block d is %d", blockd(4,5));
//blocke - 省略返回值 -字符串 - 带参数
NSString*(^blocke)(NSString *) = ^NSString*(NSString *abc){
NSString *blke = @"This is blocke";
NSString *newblke = [blke stringByAppendingString:abc];
return newblke;
};
NSLog(@"%@",blocke(@" Great"));
//blockf typedef 一个block 别名,作为一个数据类型使用
//先定义一种block的数据类型
typedef int(^blockf)(int,int);
//基于这个类型创建一个block 对象fsum
blockf fsum = ^(int valuea, int valueb){
return valuea + valueb;
};
NSLog(@"Block F is %d",fsum(45,30));
//blockg 整数返回整数 -输入inline 下面的block自动显现 block 标准格式
// <#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
// <#statements#>
// };
int(^blockg)(int) = ^(int gum) {
return gum * gum * gum;
};
NSLog(@"Block g is %d", blockg(20));
//blockh 等价于 block i 如下
//声明
int(^blockh)(int valueh);
//定义blockh
blockh = ^(int valueh) {
return valueh + 2;
};
//使用blockh
NSLog(@"Block H is %d", blockh(3));
//----------------------//
//声明和定义blocki
int(^blocki)(int) = ^(int valuei){
return valuei + 2;
};
//使用blocki
NSLog(@"Block I is %d", blocki(3));
//blockj check blockj and blockj()
void(^blockj)(void) = ^(void){
NSLog(@"This is block J");
};
//这是一个指针地址
NSLog(@"Block j is : %@", blockj);
//类似函数被调用了一次
blockj();
//blockk can be used as a parmeter in a function
//定义和声明一个block k
void(^blockk)(void) = ^(){
NSLog(@"This is block K");
};
//实例化一个对象Person
Person *tom = [[Person alloc] init];
//将block k 作为一个参数传递给 Person (tom) 的 eat方法
[tom eat:blockk];
//定义和声明一个带参数的 block l
int(^blockl)(int, int) = ^(int la, int lb) {
int lc = 0;
lc = la + lb;
NSLog(@"Block L's value is %d", lc);
return lc;
};
[tom walk:blockl];
//定义和声明一个使用typedef的block
void(^blockm)() = ^(){
NSLog(@"This is block I is a typedef");
};
[tom beat:blockm];
//定义使用一个typedef 带整数的block
int(^blockn)(int,int) = ^(int na, int nb) {
return na * nb;
};
int nnum = [tom beata:blockn];
NSLog(@"The block N is %d", nnum);
}
return 0;
}
Log:
2018-03-17 14:00:29.244955+0800 TOCBlockb[21570:1408250] This is block a
2018-03-17 14:00:29.245203+0800 TOCBlockb[21570:1408250] The Block b is 6
2018-03-17 14:00:29.245263+0800 TOCBlockb[21570:1408250] This is block c
2018-03-17 14:00:29.245282+0800 TOCBlockb[21570:1408250] THe block d is 20
2018-03-17 14:00:29.245379+0800 TOCBlockb[21570:1408250] This is blocke Great
2018-03-17 14:00:29.245401+0800 TOCBlockb[21570:1408250] Block F is 75
2018-03-17 14:00:29.245412+0800 TOCBlockb[21570:1408250] Block g is 8000
2018-03-17 14:00:29.245420+0800 TOCBlockb[21570:1408250] Block H is 5
2018-03-17 14:00:29.245428+0800 TOCBlockb[21570:1408250] Block I is 5
2018-03-17 14:00:29.245492+0800 TOCBlockb[21570:1408250] Block j is : <__NSGlobalBlock__: 0x1000022d8>
2018-03-17 14:00:29.245511+0800 TOCBlockb[21570:1408250] This is block J
2018-03-17 14:00:29.245544+0800 TOCBlockb[21570:1408250] This is block K
2018-03-17 14:00:29.245558+0800 TOCBlockb[21570:1408250] This is a Person's class
2018-03-17 14:00:29.245573+0800 TOCBlockb[21570:1408250] Block L's value is 7
2018-03-17 14:00:29.245588+0800 TOCBlockb[21570:1408250] The person's speed is 7
2018-03-17 14:00:29.245600+0800 TOCBlockb[21570:1408250] Is this ok?
2018-03-17 14:00:29.245613+0800 TOCBlockb[21570:1408250] This is block I is a typedef
2018-03-17 14:00:29.245624+0800 TOCBlockb[21570:1408250] Here is set for block M
2018-03-17 14:00:29.245637+0800 TOCBlockb[21570:1408250] The block N is 66
Program ended with exit code: 0