Main.m
#import <Foundation/Foundation.h>
#import "Person.h"
int sum(int a, int b)
{
return a+b;
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
//------------------函数指针------------------
//声明一个函数指针
int (*p)(int,int);
//对函数指针赋值(实现)
p = sum;
//调用函数指针
int result = p(1,3);
printf("result:%d\n",result);
//声明一个block,前面的int是block的返回值类型,myBlock是block的名字或者叫做变量,后面的两个int参数是形式参数
int (^myBlock)(int,int);
//实现一个block
myBlock = ^(int a,int b){
return a+b;
};
int (^myBlock1)(int,int) = ^(int a, int b){
return a-b;
};
//调用block
result = myBlock(10, 20);
printf("myBlock:result:%d\n",result);
result = myBlock1(6,3);
printf("myBlock1:result:%d\n",result);
/*----------------演示void block-----------------*/
//1、声明和实现
void (^voidBlcok)() = ^{
printf("void block");
};
//2、调用
voidBlcok();
/*--------------Person类中与main函数回掉------------*/
Person *ps = [[Person alloc] init];
[ps testMethod:^{
printf("main ps");
}];
result = [ps testMethod1:^int(int a, int b) {
return a*b;
}];
printf("ps:testMethod1:result:%d\n",result);
result = [ps testMethod2:^int(int a, int b) {
return a*b;
}];
printf("ps:testMethod2:result:%d\n",result);
//实现block,最好直接按回车键,如果自己写不太方便,容易出错
PersonBlock personBlock = ^(int a, int b){
return a*b+10;
};
result = [ps testMethod2:personBlock];
printf("ps:testMethod2:result:%d\n",result);
}
return 0;
}
Person.h
typedef int(^PersonBlock)(int,int);
@interface Person : NSObject
//不带参数也没有返回值的block作为函数参数
- (void)testMethod:(void(^)())block;
//返回一个整形,并且有两个整形参数作为blok的参数
- (int)testMethod1:(int(^)(int,int))block;
//使用PersonBlock类型做为参数
- (int)testMethod2:(PersonBlock)block;
Person.m
- (void)testMethod:(void(^)())block
{
NSLog(@"Person testMethod");
block();
}
- (int)testMethod1:(int(^)(int,int))block
{
return block(10,10);
}
- (int)testMethod2:(PersonBlock)block
{
return block(30,40);
}