Block的使用注意

//网络

//  ViewController.m并发

//  Block使用注意async

//atom

//  Created by renlei on 15/9/5.spa

//  Copyright (c) 2015 renlei. All rights reserved.队列

//内存

 

#import "ViewController.h"开发

 

@interface ViewController ()get

 

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

@property (nonatomic,strong) NSOperationQueue *queue;

 

@end

 

//UI控件 weak Strong 都没有问题

//在开发中,基本会见到全部的UI控件都是用strong

//UI控件通常不要用懒加载的方式加载,UI控件与用户是对应的,UI控件以外的,能用懒加载就用懒加载

 

@implementation ViewController

 

//懒加载

-(NSOperationQueue *)queue

{

    if (!_queue) {

        _queue = [[NSOperationQueue alloc]init];

        

        //设置最大并发数

        [_queue setMaxConcurrentOperationCount:6];

        

//        网络因素

    }

    return _queue;

}

 

- (void)viewDidLoad {

    [super viewDidLoad];

   

}

 

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

{

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

    //__weak type(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

相关文章
相关标签/搜索