美文网首页iOS学习
认识block以及注意事项。

认识block以及注意事项。

作者: Macalk | 来源:发表于2017-11-21 16:33 被阅读11次
block.png

1、声明一个block

带参数
typedef void(^nameBlock)(int one,int two);
不带参数
typedef void(^nameBlock)(void);

2、创建一个(property)block参数(block 使用copy修饰符)

typedef void(^nameBlock)(int one,int two);
@property (nonatomic,copy) nameBlock name;
或
@property (nonatomic,copy) void(^nameBlock)(int one,int two);

3、创建一个以block为参数的方法(以自定义弹出框为例)

- (void)createAlertVCWithTitle:(NSString *)title andMessage:(NSString *)message andDefultActionTitle:(NSString *)defultActionTitle andDefultAciton:(void(^)(UIAlertAction *action))defultAction andCancelActionTitle:(NSString *)cancelActionTitle andCancelAction:(void(^)(UIAlertAction *action))cancelAction {
    UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
    
    UIAlertAction *actionOne = [UIAlertAction actionWithTitle:defultActionTitle style:UIAlertActionStyleDefault handler:defultAction];
    UIAlertAction *actionTwo = [UIAlertAction actionWithTitle:defultActionTitle style:UIAlertActionStyleDefault handler:cancelAction];
    
    [alertVC addAction:actionOne];
    [alertVC addAction:actionTwo];
    [self.navigationController presentViewController:alertVC animated:YES completion:nil];
}

4、使用block传递button的点击事件
例如自定义CustomView继承与UIView,并添加UIButton
.h

@interface CustomView : UIView
@property (nonatomic,copy) buttonBlock btnBlock;
- (void)createBlockMethod:(buttonBlock)block;
@end

.m

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor yellowColor];
        
        for (int i = 0; i<3; i++) {
            UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
            btn.tag = 10+I;
            btn.backgroundColor = [UIColor orangeColor];
            btn.frame = CGRectMake(10, 10+(60)*i, self.bounds.size.width-20, 50);
            [btn setTitle:[NSString stringWithFormat:@"第%d行",i] forState:normal];
            [self addSubview:btn];
            [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
        }
    }
    return self;
}
- (void)createBlockMethod:(buttonBlock)block {
    self.btnBlock = block;
}
- (void)btnClick:(UIButton *)sender {
    self.btnBlock(sender);
}

在ViewController.m里实例化CustiomView

#import "ViewController.h"
#import "CustomView.h"
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
CustomView *customView = [[CustomView alloc]initWithFrame:CGRectMake(150, 300, 100, 200)];
    [customView createBlockMethod:^(UIButton *sender) {
        NSLog(@"这是啥---->%ld",sender.tag);
    }];
    [self.view addSubview:customView];
}
@end

注意:如果在block里要修改局部变量需要在使用__block修饰该变量 (全局变量则不需要)例如:

- (void)viewDidLoad {
    [super viewDidLoad];

int __block a = 10;
    self.block = ^(NSString *str) {
        a = 20;
    };
}

避免block的循环引用,如果A持有B,B中持有A则会造成循环引用(A<->B)引起内存泄漏,例如(当前类持有一个叫block的属性,而block里又持有当前类的属性):


WechatIMG165.jpeg

这时候需要对self进行弱引用(即使用__weak修饰self,形成弱引用)。如果name属性并不是当前self的属性,则不会引起循环引用,主要是告诉大家,不用见到block块就使用弱引用。


WechatIMG166.jpeg

既然说到了__weak的使用,那就在说说__weak和__strong的区别

__weak typeof(self) weakSelf = self; //我们根据typeof()括号里面的变量,自动识别变量类型并返回该类型。
    self.block = ^(NSString *str) {
        
        __strong __typeof(self) strongSelf = weakSelf;
        strongSelf.name = @"测试";
        strongSelf.name = @"测试";
        strongSelf.name = @"测试";

    };

__strong 确保在 Block 内,strongSelf 不会被释放。
总结
(1) 在 Block 内如果需要访问 self 的方法、变量,建议使用 weakSelf。
(2) 如果在 Block 内需要多次 访问 self,则需要使用 strongSelf。

相关文章

  • 认识block以及注意事项。

    1、声明一个block 2、创建一个(property)block参数(block 使用copy修饰符) 3、创建...

  • Block注意事项

    1.Block注意事项 在block内部可以访问block外部的变量 block内部也可以定义和block外部的同...

  • OC - Block

    导读: 一、Block是什么 二、Block的特点和作用 三、Block的声明、定义及注意事项 四、如何使用Blo...

  • iOS block深入理解

    在平时的开发中,对于block,只是知道主要用于数据回调上,对于其内部实现方式,以及一些使用时的注意事项,...

  • block

    block一、基本认识△本质也是一个OC对象,内部也有一个isa指针△block是封装了函数调用以及函数调用环境的...

  • Block

    常用写法: OC中: Swift中: 注意事项: block默认存储在栈中,如果对block进行copy操作,bl...

  • OC语言day06-15Block注意事项

    pragma mark Block注意事项 pragma mark 概念 pragma mark 代码 Perso...

  • block学习笔记

    原文发布在个人博客 clang工具 block分类 block 结构 block调用 block类型以及ARC对b...

  • iOS Block 部分三

    主要讲解 Block内修改外部变量, 内存管理, 以及循环引用; Block部分一Block部分二Block部分三...

  • OC底层面试知识点之 —— Block底层原理!

    本文将介绍block的类型,循环引用的解决方法以及block底层分析 Block简介 Block定义:带有自动变量...

网友评论

    本文标题:认识block以及注意事项。

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