__block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:
1.__block不管是ARC還是MRC模式下都可以使用罚舱,可以修飾對(duì)象,還可以修飾基本數(shù)據(jù)類(lèi)型席舍。
2.__weak只能在A(yíng)RC模式下使用秀仲,也只能修飾對(duì)象(NSString),不能修飾基本數(shù)據(jù)類(lèi)型(int)藤韵。
3.__block對(duì)象可以在block中被重新賦值,__weak不可以熊经。
子線(xiàn)程里面加入NSTimer 的時(shí)候需要 手動(dòng)添加NSRunloop? 否則不能循環(huán)泽艘。
單利里面添加 NSMutableArray 的時(shí)候欲险,防止多個(gè)地方對(duì)它同時(shí)便利和修改的話(huà),需要加原子屬性匹涮。并且用strong天试,,然低,并且寫(xiě)一個(gè)遍歷和修改的方法喜每。加上鎖。? Lock? UnLock
__weak ViewController*? weakSelf = self;? ?
GCD里面用 __weak 防止內(nèi)存釋放不了雳攘,循環(huán)引用带兜。
dispatch_group_async的使用
dispatch_group_async可以實(shí)現(xiàn)監(jiān)聽(tīng)一組任務(wù)是否完成,完成后得到通知執(zhí)行其他的操作吨灭。這個(gè)方法很有用刚照,比如你執(zhí)行三個(gè)下載任務(wù),當(dāng)三個(gè)任務(wù)都下載完成后你才通知界面說(shuō)完成的了沃于。下面是一段例子代碼:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"group1");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"group2");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:3];
NSLog(@"group3");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"updateUi");
});
dispatch_release(group);
每個(gè)一秒打印一個(gè)涩咖,當(dāng)?shù)谌齻€(gè)任務(wù)執(zhí)行后,upadteUi被打印繁莹。
dispatch_barrier_async的使用
dispatch_barrier_async是在前面的任務(wù)執(zhí)行結(jié)束后它才執(zhí)行檩互,而且它后面的任務(wù)等它執(zhí)行完成之后才會(huì)執(zhí)行