Button.h:
#import <Foundation/Foundation.h>
@class Button;
typedef void (^ButtonBlock) (Button *);
@interface Button : NSObject
@property(nonatomic,assign) ButtonBlock block;
-(void)click;
@end
Button.m:
#import "Button.h"
@implementation Button
-(void)click{
_block(self);
}
@end
main:
#import <Foundation/Foundation.h>
#import "Button.h"
typedef int (^MySum) (int,int);
//定义一个block方法,block相当于一个函数方法,也由参数和返回值
void test(){
//定义一个Block,^是block的标志
//这个block返回类型是int类型,接受两个int类型的参数
int(^Sum)(int,int)=^(int a,int b){
return a+b;
};
//调用block方法
int a=Sum(10,11);
NSLog(@"%i",a);
}
void test2(){
int c=15;
//如果外面的变量已经用__block进行了修饰,就可以在block进行修改
__block int d=16;
//由于宏定义,这里MySum是一个block类型,sum是一个变量名
MySum sum=^(int a,int b){
//block可以访问外面定义的变量
NSLog(@"我是外部变量C=%i",c);
//如果不加__block修饰,默认是不好修改外面的变量的
d=17;
NSLog(@"我是外部变量d的修改值=%i",d);
return a+b;
};
NSLog(@"%i",sum(10,10));
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
Button *btn=[[[Button alloc] init] autorelease];
test();
test2();
btn.block=^(Button *btn){
NSLog(@"按钮%@被点击了",btn);
};
[btn click];
}
return 0;
}
结果:
2013-08-02 15:50:25.568 Block[1355:303] 21
2013-08-02 15:50:25.577 Block[1355:303] 我是外部变量C=15
2013-08-02 15:50:25.578 Block[1355:303] 我是外部变量d的修改值=17
2013-08-02 15:50:25.578 Block[1355:303] 20
2013-08-02 15:50:25.579 Block[1355:303] 按钮<Button: 0x100109950>被点击了