//
// main.m
// OCBlock
//
// Created by admin on 14-8-13.
// Copyright (c) 2014年 com.longtu. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Button.h"
void BlockExample1(){
//定义一个Block,这个Block返回一个int类型,接受两个int类型的变量
int (^Calc)(int,int) = ^(int a,int b){
return a+b;
};
int result = Calc(2,3);
NSLog(@"result:%i",result);
}
//在外部声明Block
typedef void (^CalcResult)(int,int);
typedef int (^GetValue)(int,int);
void BlockExample2()
{
CalcResult calc = ^(int a,int b){//在内部实现block
int r = a+b;
NSLog(@"result:%i",r);
};
calc(1,2);
GetValue writeCalcResult = ^(int a,int b){//在内部实现声明的Block
return a+b;
};
writeCalcResult(1,2);
}
void BlockExample3()
{
int first = 10;
//block声明有两个下划线
__block int second = 12;
//声明block并且实现它
GetValue calcResult = ^(int a,int b)
{
//在block内部可以访问外部定义的变量,但是不可以修改,如果要修改的话,需要使用特殊发的方式声明,使用__block;如上
//first = 20;//错误,因为没有特殊声明
//second = 22;//可以修改,因为使用block进行了特殊声明
NSLog(@"first:%i",first);
NSLog(@"second:%i",second);
return a+b;
};
NSLog(@"block calc result:%i",calcResult(1,3));
}
//函数,注意函数与block的区别
int CalcAdd(int a,int b)
{
return a+b;
}
//声明的时候,同时实现
void BlockExample4()
{
//Block
int (^CalcResult)(int,int) = ^(int a,int b){
return a+b;
};
//block调用
int result = CalcResult(10,12);
NSLog(@"result:%i",result);
//函数调用
result = CalcAdd(6,7);
NSLog(@"result:%i",result);
//函数指针
int (*CalcP)(int ,int) = CalcAdd;
//(*CalcP)表示函数
result = (*CalcP)(3,4);
NSLog(@"result:%i",result);
}
//先声明后实现
void BlockExample5(){
//定义一个AddSum这种Block类型
typedef int (^AddSum)(int,int);
//定义了AddSump这种类型指针,这种指针指向函数
typedef int (*AddSump)(int,int);
//定义一个AddSum类型的变量
AddSum addsum = ^(int a,int b){
return a+b;
};
int result =addsum(10,13);
NSLog(@"result:%i",result);
//定义一个指针变量add,指向CalcAdd函数
AddSump add = CalcAdd;
result = (*add)(11,16);//与CalcAdd(11,16)等价
NSLog(@"result:%i",result);
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
Button *btn =[[Button alloc] init];//arc模式,不需要管理内存
btn.btnBlock = ^(Button *btn){//回调,相当于在此实现了了Block,
NSLog(@"按钮%@被点击了",btn);
};
//调用Click事件,与上面的类型,调用了Block,模拟按钮点击
[btn click];
}
return 0;
}
Button类
//block模拟点击事件
#import <Foundation/Foundation.h>
@class Button;
typedef void(^ButtonBlock)(Button *btn);
@interface Button : NSObject
@property(nonatomic,assign)ButtonBlock btnBlock;
-(void)click;
@end
#import "Button.h"
@implementation Button
-(void)click{
self.btnBlock(self);
}
@end