#import "ViewController.h"網絡
@interface ViewController ()併發
@property (nonatomic,strong) NSOperationQueue *queue;async
// UI 控件用 weak 和 Strong 都沒有問題.atom
// 在開發中,基本會見到全部的UI控件都是用 Strong來作的.spa
// UI控件通常不要用懶加載的方式加載.UI控件與用戶是對應的.UI控件以外的,能用懶加載就用懶加載.線程
@property (nonatomic,strong) UIButton *button;隊列
@end內存
@implementation ViewController開發
-(NSOperationQueue *)queueget
{
if (!_queue) {
_queue = [[NSOperationQueue alloc] init];
// 設置最大併發數.最多同時只能開啓6條線程.
[_queue setMaxConcurrentOperationCount:6];
// 網絡因素:
}
return _queue;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// __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