Block循环引用的例子

//
//  main.m
//  Block循环引用
//
//  Created by 白天钰 on 2017/8/15.
//  Copyright © 2017年 baitianyu. All rights reserved.
//

#import 

typedef void (^blk_t) (void);

@interface MyObject : NSObject {

    blk_t blk_;
    
    blk_t blk_2;
    
    id obj_;
}

@end

@implementation MyObject

- (id)init {

    self = [super init];
    
    //通过Block语法生成在栈上的Block此时由栈复制到堆,并持有所使用的self,循环应用产生
//  解决方式
//    id __weak tmp = self;
//    
//    blk_ = ^{NSLog(@"self = %@", tmp); };
    
    blk_ = ^{NSLog(@"self = %@", self); };
    
    blk_2 = ^{NSLog(@"self = %@", obj_); };
    
    blk_();
    
    return self;
}

- (void)dealloc {

    NSLog(@"dealloc");
}


@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        MyObject *o = [[MyObject alloc] init];
        
        
    
        
        NSLog(@"%@", o);
    }
    return 0;
}


 
 

你可能感兴趣的:(iOS)