Block介紹
- Block是一個匿名的函數代碼塊,此代碼塊可以當做參數傳給其他對象。
- Block與代理協議的功能一樣,都是用于對象通信的。
Block語法定義
*Block變量定義: 返回值(^變量名)(函數參數...)
int (^myBlocks)(int);
*Block函數的創建
myBlocks = ^(int a){
int result = a * a;
return result;
}
*Block函數的調用
int ret = myBlocks(10);
- block是一個匿名函數代碼塊
1>block聲明的時候,就是傳值的時候,代碼塊并沒有被運行
2>在block回調的時候代碼塊才被執行 - typedef對block類型進行重命名(參數類型和返回值類型,以及有無參數,有無返回值,都會造成block類型)
typedef int (^MathBlock)(int, int);
MathBlock mulBlock;
mulBlock = ^(int a, int b){
return a * b;
};
NSLog(@"a*b = %d", mulBlock(2, 3));
Block實現對象間通信(保姆與小孩問題)
小孩類:
#import <Foundation/Foundation.h>
@interface Child : NSObject
typedef void(^HandleChildBlock)(Child *);
//小孩的清潔值
@property(nonatomic, assign)NSInteger cleanValue;
//Block的內存管理方式用copy
@property(nonatomic, copy)HandleChildBlock washBlock;
@end
#import "Child.h"
@implementation Child
- (instancetype)init
{
self = [super init];
if (self) {
_cleanValue = 100;
//定時器,循環調用方法,清潔值減少
[NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(timerAction:)
userInfo:nil
repeats:YES];
}
return self;
}
- (void)timerAction:(NSTimer *)timer {
NSLog(@"cleacValue:%lu", _cleanValue);
_cleanValue--;
if (_cleanValue == 95) {
//當清潔值為95時,保姆給小孩洗澡
if (self.washBlock) {
_washBlock(self);
}
}
}
@end
保姆類:
#import <Foundation/Foundation.h>
@class Child;
@interface Nanny : NSObject
- (void)washChild:(Child *)child;
@end
#import "Nanny.h"
#import "Child.h"
@implementation Nanny
- (void)washChild:(Child *)child {
child.washBlock = ^(Child *ch){
//Block代碼塊
NSLog(@"保姆給小孩洗澡");
ch.cleanValue = 100;
};
}
@end