现在的位置: 首页 > 综合 > 正文

Objective-C中的block以及block实现监听器思想

2013年10月24日 ⁄ 综合 ⁄ 共 1200字 ⁄ 字号 评论关闭

Block(代码段):

Block封装了一段代码,可以再任何时候执行
Block可以作为函数参数或者函数返回值

定义block方法一:
#import "Button.h"

void test(){
 //^ 是block的标志 ,定义一个block返回值int类型,接受两个int类型的参数
   int (^Sum) (int,int) = ^(int a, int b){
  return a+b;
   }
 
   int a = Sum(10,11); 
   NSLog(@"%i", a);
}

int main(int argc , const char * argv[] ){
    @autoreleasepool{
  test();
     }
}

定义block 方法二:
#import "Button.h"

typedef int (^MySum)(int, int );
void test2(){
    __block int c = 15; //两个下划线
    int t=20
     //声明一个block 变量
     MySum sum = ^(int a, int b){
        NSLog(@"%i", t); //可以访问外面的变量,但是不能改变值
 c = 25; //如果外部变量用了__block  关键字,就可以在block内部修改这个变量
 return a+b;
     };
     NSLog(@"%i", sum(10,15));
}

int main(int argc , const char * argv[] ){
    @autoreleasepool{
   test2();
     }
}

利用block实现监听器思想:
.m文件
#import "Button.h"

@implementation Button
-(void)click{
    _block(self);
}
@end

.h文件
#import <Foundation/Foundation.h>
@class Button;

typedef void (^ButtonBlock) (Button * btn);

@interface Button : NSObject

@property (nonatomic, assign) ButtonBlock block;

-(void) click;

@end

main方法中运行

#import <Foundation/Foundation.h>
#import "Button.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
       
        Button * btn = [[[Button alloc] init] autorelease];
   
        btn.block = ^(Button * btn){
            NSLog(@"button %@ is clicked",btn);
        };
       
        [btn click];
    }
    return 0;
}

抱歉!评论已关闭.