ios - block循环引用Demo示例

当实例变量中有了block属性,并且用copy来修饰,但是当调用block中的代码的时候,如果block中运用了self.属性的时候回造成循环引用.


//
// ViewController.h
// block循环引用
//
// Created by 裴波波 on 16/5/3.
// Copyright © 2016年 裴波波. All rights reserved.
// #import <UIKit/UIKit.h> /** 定义一个block的类 */
typedef int(^PBlcok)(int a,int b); @interface ViewController : UIViewController /** 属性中含有PBlcok类型的block */
@property (nonatomic, copy) PBlcok block; @property (nonatomic, copy) NSString *name; @end

.m中


//
// ViewController.m
// block循环引用
//
// Created by 裴波波 on 16/5/3.
// Copyright © 2016年 裴波波. All rights reserved.
// #import "ViewController.h" @interface ViewController () @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ /** 用__weak修饰self避免循环引用 */
//只要你在block内部使用了self所拥有的任何东西,例如属性,都会造成循环引用
__weak typeof(self) weakself = self;
self.block = ^(int a,int b){
weakself.name = @"pbb";
NSLog(@"%d",a + b);
return a + b;
};
self.block(2,3);
} - (void)viewDidLoad {
[super viewDidLoad];
} @end

block被copy后,内部出现self则会对其强引用.ARC下用__weak来解决,MRC下用__block来解决

ios - block循环引用Demo示例

上一篇:jquery网页倒计时效果,秒杀


下一篇:gulp工作流