您的位置:首页 > 移动开发 > IOS开发

ios - block循环引用Demo示例

2016-05-04 00:18 671 查看

当实例变量中有了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来解决


Demo地址 : https://github.com/adampei/CycleReference.git
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: