Block循环引用解决办法

  • ModalViewController

// ModalViewController.h
#import <UIKit/UIKit.h>

@interface ModalViewController : UIViewController

@end


// ModalViewController.m
#import "ModalViewController.h"

@interface ModalViewController ()

@property (nonatomic ,strong) void(^block)();

@end

@implementation ModalViewController

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)dealloc
{
    NSLog(@"%@对象销毁",self);
}

/**
 *  说明,如果_block里面保存的代码只是在主线程执行,而且内部保存的代码用到外界的self
    那么,必须得__weak typeof(self) weakSelf = self;然后用weakSelf变量就可以了,
    放在循环引用,
    如果保存的代码还得在子线程或者主线程延时之后做一些操作的话,还得用到self的话,首先第一步是
    __weak typeof(self) weakSelf = self;第二步在保存的代码位置写__strong typeof(weakSelf) strongSelf = weakSelf;然后用strongSelf变量就可以了
 */

 
- (void)viewDidLoad {
    [super viewDidLoad];
    int a = 0;

    // Block循环引用,跟block调用没有关系
    // block只要访问外部强指针对象变量,就会对这个变量进行强引用.
    __weak typeof(self) weakSelf = self;

    _block = ^{

        __strong typeof(weakSelf) strongSelf = weakSelf;

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

            NSLog(@"延迟打印%@",strongSelf);

        });

    };

    _block();
}

@end


  • ViewController

// ViewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController


@end

// ViewController.m
#import "ViewController.h"
#import "ModalViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    ModalViewController *modalVc = [[ModalViewController alloc] init];

    modalVc.view.backgroundColor = [UIColor redColor];

    [self presentViewController:modalVc animated:YES completion:nil];
}

- (void)viewDidLoad {
    [super viewDidLoad];

}

@end


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容