今日更加仔細(xì)的學(xué)習(xí)了block的使用方法,真是大開眼界卖局,以前都不知道block這么強大,下面仔細(xì)說下,有不足的希望大家多多指教已日!
先說一下block定義方法:
returnType(^blockName)(parameterTypes) = ^(parameters) {
statements
};
使用方法一
把block保存到對象中,在恰當(dāng)時機調(diào)用栅屏。
//定義
typedef void(^blockName)();
@property(nonatomic,copy)blockName block1;
@property(nonatomic,copy)void(^blockTest1)();
@property(nonatomic,copy)void(^block2)();
//帶參數(shù)的
@property(nonatomic,copy)void(^block3)(int);
@property(nonatomic,copy)void(^block4)(int, NSString *,BOOL);
@property(nonatomic,copy)NSString *(^block5)(int, NSString *);
//實現(xiàn)以及調(diào)用
-(void)blockUse1
{
void(^blockName)() = ^{
NSLog(@"-----block第一種用法");
};
//調(diào)用
blockName();
_blockTest1 = blockName;
_block3 = ^(int m){
NSLog(@"%d -- 米",m);
};
_block4 = ^(int m, NSString * str, BOOL isYes){
NSLog(@"%d, %@, %d",m, str, isYes);
};
//帶有參數(shù)和返回值的block實現(xiàn)
_block5 = ^NSString *(int m, NSString * str){
return [NSString stringWithFormat:@"%d -- %@",m, str];
};
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
_blockTest1();
_block3(5);
_block4(4, @"hello",YES);
NSString * str = _block5(10, @"Hello");
NSLog(@"----%@",str);
}
使用方法二
block充當(dāng)方法的參數(shù)飘千。
特點:在方法內(nèi)部調(diào)用block,外部實現(xiàn)block栈雳。
//使用2:把block當(dāng)做方法的參數(shù)使用护奈,由方法外部實現(xiàn),內(nèi)部調(diào)用
//block 無參數(shù)
-(void)eat:(void(^)())block;
//block 有參數(shù)
-(void)eat:(void(^)(int))block1 apple:(void(^)(int))block2;
//block 有參數(shù)哥纫,有返回值
-(void)run:(int(^)(int))block;
//方法實現(xiàn)霉旗,block調(diào)用
-(void)eat:(void (^)())block
{
//調(diào)用
block();
}
-(void)eat:(void (^)(int))block1 apple:(void (^)(int))block2
{
block1(5);
block2(10);
}
-(void)run:(int (^)(int))block
{
int a = block(10);
NSLog(@"run -- a :%d", a);
}
//block實現(xiàn)
-(void)blockUser2
{
//可以反向傳值
Person * p = [[Person alloc]init];
//1.block 無返回值,無參數(shù)
[p eat:^{
NSLog(@"blockUse2 -- 吃東西");
}];
//2.block無返回值蛀骇,有參數(shù)
[p eat:^(int m) {
NSLog(@"m -- %d",m);
} apple:^(int n) {
NSLog(@"n -- %d",n);
}];
int(^bb)(int) = ^int(int m){
return m+5;
};
int b = bb(5);
//3.block有返回值厌秒,有參數(shù)
[p run:^int(int m) {
return m+10;
}];
}
使用方法三
block充當(dāng)方法的返回值。
特點:在方法內(nèi)部實現(xiàn)block擅憔,外部調(diào)用block鸵闪。
目的是為了替代方法,實現(xiàn)了 鏈?zhǔn)骄幊獭?/p>
//1.block無返回值暑诸,無參數(shù)
-(void(^)())eat;
//2.block無返回值蚌讼,有參數(shù)
-(void(^)(int, NSString *))eatMany;
//3.block有返回值辟灰,有參數(shù),可以得到返回值
-(int(^)(int))run;
-(void (^)())eat
{
return ^{
NSLog(@"block3 -- block做方法返回值 -- ");
};
}
-(void (^)(int, NSString *))eatMany
{
return ^(int m, NSString * str){
NSLog(@"eat - %d篡石, I am %@", m, str);
};
}
-(int (^)(int))run
{
return ^int(int m){
return m + 10;
};
}
//外部調(diào)用
-(void)blockUse3
{
Person * p = [[Person alloc]init];
//1.block無返回值芥喇,無參數(shù)
p.eat();
//2.block無返回值,有參數(shù)
p.eatMany(5, @"Happy");
//3.block有返回值夏志,有參數(shù)乃坤,可以得到返回值,可以在調(diào)用的時候把值傳過去沟蔑,再接受處理后的值湿诊,和以前的帶參且有返回值的方法調(diào)用原理一樣
int a = p.run(10);
NSLog(@"a current value -- %d",a);
}
使用方法四(最容易混亂的方法)
特點:block既充當(dāng)方法參數(shù),又充當(dāng)方法返回值瘦材!
//方法定義
-(NSString *(^)(NSString *))swimMeter:(int(^)(int))block;
//方法實現(xiàn)
-(NSString *(^)(NSString *))swimMeter:(int (^)(int))block
{
int meter = block(10);
return ^NSString *(NSString * str){
return [NSString stringWithFormat:@"小明-- %@ -- %d meter",str, meter];
};
}
//外部調(diào)用
NSString *(^block)(NSString *str) = [p swimMeter:^int(int meter) {
return meter += 10;
}];
NSString * str = block(@"swims");
NSLog(@"%@",str);
注意:
方法四外部首先要實現(xiàn)參數(shù)block厅须,然后再調(diào)用返回值block!