Block

简介: Button.h: #import @class Button;typedef void (^ButtonBlock) (Button *);@interface Button : NSObject@property(nonatomic,as...

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


相关文章
|
存储 数据安全/隐私保护
RPMB说明与使用(Replay Protected Memory Block)
RPMB说明与使用(Replay Protected Memory Block)
2485 0
|
11月前
display:block小技巧
display:block小技巧
53 0
|
存储 iOS开发
浅谈block
浅谈block
47 0
|
编译器 C++
block原理
block本质上也是一个OC对象,它内部也有个isa指针;block是封装了函数调用以及函数调用环境的OC对象
213 0
block原理
|
存储 内存技术
Long Story of Block - segment
## segment segment 的概念实际来自 DMA controller,DMA controller 可以实现一段内存物理地址区间与一段设备物理地址区间之间的数据拷贝,segment 就描述 DMA 数据传输过程中的一段连续的内存空间,也就是说 DMA controller 可以将内存中一个 segment 中的数据拷贝到设备,或将设备中的数据拷贝到 segment 中 s
881 1
Long Story of Block - segment
|
存储 编译器 iOS开发
Block 详解
原文链接:www.imlifengfeng.com 一、概述 闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」;Block 是 Objective-C 对于闭包的实现。
973 0