Block的用法

Block即代码块,有点类似函数

效率很高,苹果官方推荐使用。

可以用Block实现类似Java8的新特性 lambda表达式 的效果,也和匿名类很像。

有篇博客对block分析很透彻:

http://www.cnblogs.com/ymonke/p/3511304.html

1. 定义一个Block:

形式为:

类型 (^ block名) (参数类型用逗号隔开)= ^(参数类型和参数名) {

具体实现

};

void testBlock1() {
    int (^myBlock1) (int, int) = ^(int a, int b) {
        return a + b;
    };
    
    int s = myBlock1(1, 2);
    NSLog(@"s = %i", s);
}


或者可以借助typedef定义:

typedef int (^MyBlock2) (int, int);
void testBlock2() {
    MyBlock2 myBlock2 = ^(int a, int b) {
        return a * b;
    };
    
    int s = myBlock2(2, 3);
    NSLog(@"%i", s);
}


2. Block可以访问局部变量,但默认不能修改(编译阶段就会报错);如果要修改,在外部声明的局部变量加关键字__block(两个下划线!)。Java匿名类中要访问外部变量需要在外部变量前加final,并且不能修改。



3. 可以实现Java中接口回调的功能。(参考了M了个J老师的视频)

具体如下:(ARC模式on)

main.m

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

typedef int (^MyBlock2) (int, int);
void testBlock2() {
    MyBlock2 myBlock2 = ^(int a, int b) {
        return a * b;
    };
    
    int s = myBlock2(2, 3);
    NSLog(@"%i", s);
}

void testBlock1() {
    int (^myBlock1) (int, int) = ^(int a, int b) {
        return a + b;
    };
    
    int s = myBlock1(1, 2);
    NSLog(@"s = %i", s);
}

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

    @autoreleasepool {
//        testBlock1();
//        testBlock2();
        
        Button *button = [[Button alloc] init];
        
        //设置回调方法。
        button.listener = ^(Button *button) {
            NSLog(@"%@被点击啦!", button);
        };
        
        //模拟点击时间,触发回调。
        [button click];
        
    }
    return 0;
}

Button.h

#import <Foundation/Foundation.h>

@class Button;
typedef void (^MyListenerBlock) (Button *button);

@interface Button : NSObject

// block 的 setter处理不是assign, 用copy
// 原因: http://www.cnblogs.com/ymonke/p/3511304.html

// 利用Block实现回调
@property (nonatomic, copy) MyListenerBlock listener;

- (void)click;

@end

Button.m:


#import "Button.h"

@implementation Button

- (void)click {
    _listener(self);
}
@end







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值