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>被点击了