iOS-Block

作者: 存在即是美 | 来源:发表于2017-01-17 10:35 被阅读5次

block已经成为我在iOS编写中最为常用的回调方法 , 它简单便捷 , 取代了代理大部分的工作 , 今天整理一下 , 只需要跟着敲一遍就会了 , 如果学过C的话 , 对照函数 , 把*变成^就差不多了 .

void(^myblocks)(void) = NULL;
myblocks = ^(void){
   NSLog(@"in myblocks");
};
NSLog(@"before myblocks");
myblocks();
NSLog(@"after myblocks");


int (^myblocks2)(int a,int b) = NULL;
myblocks2 = ^(int a, int b){
    int c = a + b;
    return c;
};
NSLog(@"before myblock2");
int ret = myblocks2(10 , 23);
NSLog(@"after myblock2 %d",ret);


//这个需要注意
__block int sum = 0;
int (^myblocks3) (int a , int b) = ^(int a , int b){
    sum = a + b;
    return 3;
};
int ret2 = myblocks3(33 , 77);
NSLog(@"%d",ret2);
NSLog(@"%d",sum);

//typedef
myblock4 mybl = ^(void){
    NSLog(@"typedef 的调用");
};
mybl();

下面是常用方式:
在建立的一个view中写一个block然后在控制器中调用:

1.创建view
.h中
#import <UIKit/UIKit.h>
typedef void (^myblocksMB)(void);
@interface ButtonView : UIView
@property (nonatomic , copy) myblocksMB blockMB;
@end

.m中
#import "ButtonView.h"

@implementation ButtonView

- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
    
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.backgroundColor = [UIColor redColor];
    
    button.frame = CGRectMake(0, 0, frame.size.width/2, frame.size.width/2);
    
    [button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
    
    [self addSubview:button];
}

    return self;
}

- (void)buttonClick:(UIButton *)button
{
    if (self.blockMB) {
        self.blockMB();
    }
}
@end

2.控制器中调用

#import "ViewController.h"
#import "ButtonView.h"
@interface ViewController ()
end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    ButtonView *view = [[ButtonView alloc] initWithFrame:CGRectMake(100, 100, 100, 300)];

    [self.view addSubview:view];

    view.blockMB = ^(void){

        NSLog(@"回调的方法");

    };
}
@end

点击红色小方块就可以打印"回调的方法"了.可以带参数 , 跟上面区别不大,把void换一下就好了 .还有一个 , 很多时候 , 例如在封装网络请求的时候 , 把block当参数拼进去 , 就把(void)(^block)(void)看做一个整体 , 看做NSString之类的就可以了 , 例如很多人现在用的AFNetworking里面就有 , 可以跟着敲两遍 , 用时间长了 , 就自然了 .

相关文章

  • iOS-Block本质

    iOS-Block本质 参考篇:iOS-Block浅谈[https://www.jianshu.com/p/25a...

  • Objective-C的本质(6)——Block本质

    参考:iOS-Block本质iOS底层原理总结 - 探寻block的本质(一)iOS底层原理总结 - 探寻bloc...

  • iOS-block

    一. 查看block内部实现 1.编写block代码void (^DemoBlock)(int, int) = ^...

  • ios-Block

    概述: 能够截取自动变量的匿名函数 指向函数的指针 结构体 oc对象 使用: - 声明 - 定义(变量赋值) - ...

  • iOS-Block

    Block是一种匿名函数,也是一种Objective-C对象。 语法 返回值和参数列表都可以省略 声明 block...

  • iOS-block

    1.相关概念在这篇笔记开始之前,我们需要对以下概念有所了解。1.1 操作系统中的栈和堆注:这里所说的堆和栈与数据结...

  • iOS-Block

    block已经成为我在iOS编写中最为常用的回调方法 , 它简单便捷 , 取代了代理大部分的工作 , 今天整理一下...

  • iOS-block

    一. block的声明、调用、实现 1. block的声明 返回值(^block变量名)(参数); 例如: 2. ...

  • IOS-Block

    Block初探 blcok的分类 不同关键字修饰的变量auto和static在OC中有个默认的关键字auto,在我...

  • iOS-Block

    面试题 block的原理是怎样的?本质是什么? 封装了函数调用以及调用环境的OC对象 __block的作用是什么?...

网友评论

      本文标题:iOS-Block

      本文链接:https://www.haomeiwen.com/subject/wrrmbttx.html