虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > IOS编程/Objective-C > iOS MRC 下 block 循环引用问题实例讲解

iOS MRC 下 block 循环引用问题实例讲解
类别:IOS编程/Objective-C   作者:码皇   来源:互联网   点击:

本文通过文字说明加代码的形式给大家介绍了iOS MRC 下 block 循环引用问题,非常不错,具有参考借鉴价值,需要的朋友参考下吧

下面一段代码给大家介绍iOS MRC 下 block 循环引用问题            

    //注意此__block会复制一份指针出来 一次原始的指针如果置为nil的话,此处复制出来的指针还是野指针 __block __typeof(self)weakSelf = self;
    //__weak __typeof(self)weakSelf = self;
    //__weak Person *weakSelf = self;
    void (^block)(void) = ^(void){
    //NSLog(@"name --> is %@", self.name);
    //NSLog(@"name --> is %@", weakSelf.name);
    //这样判断会crash 此时weakSelf为野指针 //weakSelf 这时候是个野指针。。。野指针也是指针对吧?反正,这个野指针并不为NULL,虽然它指向的内存并未有什么鸟用, //然而代码并不知道。所以 执行[weakSelf doSomething];
    必然闪退。 //注意此__block会复制一份指针出来 一次原始的指针如果置为nil的话,此处复制出来的指针还是野指针 // if (weakSelf) {
    // NSLog(@"name --> is %@", weakSelf.name);
    // }
    //malloc(22);
    // malloc_zon //这并没有什么卵用。。。weakSelf 已经是野指针 照样crash // __strong __typeof(weakSelf) strongSelf = weakSelf;
    // if (weakSelf) {
    // NSLog(@"name --> is %@", strongSelf.name);
    // }
    if (malloc_zone_from_ptr(weakSelf)) {
    NSLog(@"name --> is %@", weakSelf.name);
    }
    // // ViewController.m // test_mrc_block_self_01 // // Created by jeffasd on 2017/12/1. // Copyright ©
    2017年 jeffasd. All rights reserved. // #import "ViewController.h" #import "Person.h" @interface ViewController () @property (nonatomic, copy) NSString *name;
    @end @implementation ViewController - (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    self.name = @"xiaoming";
    }
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    self.view.backgroundColor = [UIColor cyanColor];
    // void (^block)(void) = ^(void){
    // NSLog(@"name --> is %@", self.name);
    // }
    ;
    // // // // for (int i = 0;
    i < 30;
    i++) {
    // block();
    // }
    Person *xiaoming = [[Person alloc] init];
    //[xiaoming retain];
    [xiaoming release];
    // xiaoming = nil;
    xiaoming = NULL;
    }
    - (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated. }
    @end
    // // Person.m // test_mrc_block_self_01 // // Created by jeffasd on 2017/12/1. // Copyright ©
    2017年 jeffasd. All rights reserved. // #import "Person.h" #include <malloc/malloc.h> @interface Person () @property (nonatomic, copy) NSString *name;
    @end @implementation Person - (instancetype)init{
    if (self = [super init]) {
    self.name = @"xiaoming";
    //注意此__block会复制一份指针出来 一次原始的指针如果置为nil的话,此处复制出来的指针还是野指针 __block __typeof(self)weakSelf = self;
    //__weak __typeof(self)weakSelf = self;
    //__weak Person *weakSelf = self;
    void (^block)(void) = ^(void){
    //NSLog(@"name --> is %@", self.name);
    //NSLog(@"name --> is %@", weakSelf.name);
    //这样判断会crash 此时weakSelf为野指针 //weakSelf 这时候是个野指针。。。野指针也是指针对吧?反正,这个野指针并不为NULL,虽然它指向的内存并未有什么鸟用, //然而代码并不知道。所以 执行[weakSelf doSomething];
    必然闪退。 //注意此__block会复制一份指针出来 一次原始的指针如果置为nil的话,此处复制出来的指针还是野指针 // if (weakSelf) {
    // NSLog(@"name --> is %@", weakSelf.name);
    // }
    //malloc(22);
    // malloc_zon //这并没有什么卵用。。。weakSelf 已经是野指针 照样crash // __strong __typeof(weakSelf) strongSelf = weakSelf;
    // if (weakSelf) {
    // NSLog(@"name --> is %@", strongSelf.name);
    // }
    if (malloc_zone_from_ptr(weakSelf)) {
    NSLog(@"name --> is %@", weakSelf.name);
    }
    }
    ;
    for (int i = 0;
    i < 300;
    i++) {
    // dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // block();
    // }
    );
    dispatch_async(dispatch_get_main_queue(), ^{
    block();
    }
    );
    }
    }
    return self;
    }
    @end

总结

以上所述是小编给大家介绍的iOS MRC 下 block 循环引用问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

您可能感兴趣的文章:

  • iOS中详解Block作为property属性实现页面之间传值
  • 一篇文章让你看懂IOS中的block为何再也不需要WeakSelf弱引用
  • iOS中block变量捕获原理详析
  • 浅谈iOS 对于block的一点理解
  • iOS在Block中修改外部变量值的实现代码
  • iOS面试中如何优雅回答Block导致循环引用的问题
  • IOS 使用Block二次封装AFNetworking 3.0详解
  • iOS通过逆向理解Block的内存模型
  • iOS利用Block逆向传值的方式详解
  • iOS通过block在两个页面间传值的方法
  • iOS中Block的回调使用和解析详解
  • iOS 9 更新之Safari广告拦截器(Content Blocker)开发教程
  • iOS(闭包)block传值详解
相关热词搜索: ios block循环引用 block循环引用