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


猜你喜欢

转载自blog.csdn.net/jeffasd/article/details/78690342