1.block:块语法,是一种新的语法结构。学习的时候可以类比于函数指针。
2.block和函数指针对比
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
//声明函数
int add(int,int);
int main(int argc, char * argv[]) {
@autoreleasepool {
//函数名表示函数的入口地址
int (*p)(int,int) = add;
int num = p(3,5);
NSLog(@"%d",num);
//声明一个block,就如同把函数指针的*换成^
int (^block)(int,int);
//实现这个block
block = ^(int a,int b){
return a+b;
};
NSLog(@"%d",block(3,6));
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
//实现函数
int add(int a,int b) {
return a + b;
}
3.block声明和实现写在一起
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
/*
* ^是块语法符号,变量名是voidBlock
* 声明格式:返回值类型(^块变量)(参数类型1,参数类型2,...)
* 实现格式:^(参数类型1,参数类型2,...)
*/
void (^voidBlock)(void) = ^(void){
NSLog(@"将block的声明和实现写在一起");
};
voidBlock();
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
4.__block关键字
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
//块语法中能够访问到变量,但是变量无法被更改,如果想在块语法中更改捕获的变量,需要加__block关键字修饰
__block int number = 5;
void (^changeVar)(int) = ^(int a){
number = a;
};
changeVar(15);
NSLog(@"%d",number);
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
5.block传值
①创建Supermarket类
Supermarket.h
#import <Foundation/Foundation.h>
@interface Supermarket : NSObject
@property (nonatomic, copy) void(^byValueBlock)(NSString *);
- (void)begin;
- (void)finish;
@end
Supermarket.m
#import "Supermarket.h"
@implementation Supermarket
- (void)begin {
sleep(2);
[self finish];
}
-(void)finish {
self.byValueBlock(@"500元整");
}
@end
②创建Student类
Student.h
#import <Foundation/Foundation.h>
@interface Student : NSObject
- (void)buy;
@end
Student.m
#import "Student.h"
#import "Supermarket.h"
@implementation Student
-(void)buy {
Supermarket *supermarket = [[Supermarket alloc] init];
NSLog(@"我购买的东西多少钱?");
supermarket.byValueBlock = ^(NSString *str){
NSLog(@"%@",str);
};
[supermarket begin];
}
@end
③main.m
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "Student.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
Student *student = [[Student alloc] init];
[student buy];
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
6.block作为参数
①新建Market类
Market.h
#import <Foundation/Foundation.h>
typedef void (^marketBlock)(void);
@interface Market : NSObject
- (void)beginWithMoney:(marketBlock)block;
@end
Market.m
#import "Market.h"
@implementation Market
-(void)beginWithMoney:(marketBlock)block {
NSLog(@"开始购物");
sleep(2);
NSLog(@"购物完成了");
block();
}
@end
②创建Person类
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (void)buy;
@end
Person.m
#import "Person.h"
#import "Market.h"
@implementation Person
-(void)buy {
Market *market = [[Market alloc] init];
[market beginWithMoney:^{
NSLog(@"这次买衣服又花了500元");
}];
}
@end
③main.m
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "Person.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
Person *person = [[Person alloc] init];
[person buy];
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}