//
// 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