码迷,mamicode.com
首页 > 编程语言 > 详细

多线程 block中self 强引用问题

时间:2015-09-06 01:08:49      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:

#import "ViewController.h"

 

@interface ViewController ()

 

// 定义一个全局的队列属性.方便在任何方法中都可以使用这个Queue

@property (nonatomic,strong) NSOperationQueue *queue;

 

// UI 控件用 weak 和 Strong 都没有问题.

// 在开发中,基本会见到所有的UI控件都是用 Strong来做的.

// UI控件一般不要用懒加载的方式加载.UI控件与用户是对应的.UI控件之外的,能用懒加载就用懒加载.

@property (nonatomic,strong) UIButton *button;

@end

 

@implementation ViewController

 

// 懒加载

-(NSOperationQueue *)queue

{

    if (!_queue) {

        _queue = [[NSOperationQueue alloc] init];

        

        // 设置最大并发数.最多同时只能开启6条线程.

        [_queue setMaxConcurrentOperationCount:6];

        

        // 网络因素:

    }

    return _queue;

}

 

- (void)viewDidLoad {

    [super viewDidLoad];

    

  

}

 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    

    // 这里直接在Block 中使用 self 会造成循环引用. Block使用的注意点之一:循环引用.

    //  __weak typeof(self) wself = self; wself 就是 self 的弱引用写法.

    

    // GCD中的任务都是封装在Block中,如果GCD中的Block中出现了 self,会造成循环引用吗?

    //

    

//    dispatch_async(dispatch_get_main_queue(), ^{

//        [self test];

//    }); 会造成循环引用吗? 不会造成循环引用,因为 self 对这个Block 没有强引用.

 

    // 创建操作

    __weak typeof(self) wself = self;

    NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{

        

        // Block中出现self .Block 对 self 是强引用.

        [wself test];

    }];

    

    // 将操作添加到队列中.

    // self.queue 对 op 就是强引用.

    [self.queue addOperation:op];

}

 

// 接收到内存警告的时候,就会调用.

- (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    

    // 取消操作.有两个方法:

    // 1> 操作队列取消所有的操作

    

    // 取消所有操作. 对于取消的操作,无法再次恢复.

    [self.queue cancelAllOperations];

    

    // 2> 单个操作可以取消.NSOperation的方法.

    

    

}

 

- (void)test1

{

    // NSOperation 高级操作 : 暂停/恢复

    // 这两个方法,一般用在与用户交互的时候.

    

    // 暂停队列中的所有操作

    [self.queue setSuspended:YES];

    

    // 恢复队列中的所有操作

    [self.queue setSuspended:NO];

}

 

 

- (void)test

{

    NSLog(@"下载任务(非常耗时)------------%@",[NSThread currentThread]);

}

 

@end

 

多线程 block中self 强引用问题

标签:

原文地址:http://www.cnblogs.com/liyang1991/p/4784220.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!