码迷,mamicode.com
首页 > 其他好文 > 详细

Block的使用注意

时间:2015-09-05 06:33:48      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:

//

//  ViewController.m

//  Block使用注意

//

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

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

//

 

#import "ViewController.h"

 

@interface ViewController ()

 

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

@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

Block的使用注意

标签:

原文地址:http://www.cnblogs.com/R-X-L/p/4782661.html

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