block的两种形式
#import <Foundation/Foundation.h>
// 声明一个Block
typedef int (^MySum) (int, int);
// 通过声明实现
void block1(){
//block外部的变量对于内部来说是只读的,若想要内部可以修改该变量,需要用__block关键字进行修饰
int c = 1;
__block int d = 1;
// 实现Block
MySum sum = ^(int a, int b){
//未使用__block关键字,编辑器报错
//c = 2;
//NSLog(@"c is %i", c);
//使用了__block关键字
d = 2;
NSLog(@"d is %i", d);
return a + b;
};
int result = sum(2, 3);
NSLog(@"%i", result);
}
void block2(){
// 直接实现Block
int (^sum) (int, int) = ^(int a, int b ){
return a + b;
};
int result = sum(1, 2);
NSLog(@"%i", result);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
block1();
block2();
}
return 0;
}
=======================================================
利用Block实现监听器
main.m
—————————————————————
int main(int argc, const char * argv[]) {
@autoreleasepool {
Button *btn = [Button alloc];
//btn.block 自定义类属性
btn.block = ^(Button *btn){
NSLog(@"按钮-%@被点击一次", btn);
};
[btn click];
}
return 0;
}
Button.h
——————————————————
#import <Foundation/Foundation.h>
@class Button;
typedef void (^ButtonBlock) (Button *);//定义一个类型为buttonBlock参数是Button类型的Block
@interface Button : NSObject
@property (nonatomic, assign) ButtonBlock block;//定义get和set方法
-(void)click;
@end
Button.m
—————————————————
#import "Button.h"
@implementation Button
-(void)click{
_block(self);
}
@end