1.為什么子線程中運(yùn)行循環(huán)是默認(rèn)關(guān)閉的玻靡?
首先一個(gè)子線程沒(méi)事開(kāi)啟什么死循環(huán)啊掏婶?
子線程用完就應(yīng)該回收啊啃奴,釋放內(nèi)存,因?yàn)檫\(yùn)行循環(huán)一直存在著干嘛雄妥?
這不是浪費(fèi)資源嗎!依溯!
所以老厌,它是默認(rèn)關(guān)閉的。
2.關(guān)閉的運(yùn)行循環(huán)會(huì)影響子線程中那些方法的執(zhí)行黎炉?
定時(shí)器方法枝秤,不會(huì)執(zhí)行,因?yàn)闆](méi)有運(yùn)行循環(huán)慷嗜、
perform方法,是帶有延遲功能的方法淀弹,不會(huì)執(zhí)行。
對(duì)于perform方法可以看如下總結(jié):
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self performSelectorInBackground:@selector(timerDemo) withObject:nil];
}
- (void)timerDemo
{
NSLog(@"begin");
// //方案一:
// // 1.創(chuàng)建定時(shí)器
// NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(fireDemo) userInfo:nil repeats:YES];
//
// // 2.把定時(shí)器添加到當(dāng)前子線程的運(yùn)行循環(huán)(子線程的運(yùn)行循環(huán)默認(rèn)不開(kāi)啟)
// [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
//
// // 3.手動(dòng)開(kāi)啟子線程的運(yùn)行循環(huán) (這個(gè)是主線程的運(yùn)行循環(huán)和子線程的運(yùn)行循環(huán)唯一的不同點(diǎn))
// // run : 一旦調(diào)用這個(gè)方法開(kāi)啟子線程的運(yùn)行循環(huán),就不會(huì)停止
// // 一旦開(kāi)啟運(yùn)行循環(huán),相當(dāng)于就開(kāi)啟了死循環(huán)
// [[NSRunLoop currentRunLoop] run];
// 方案二:
// runUntilDate : 讓子線程的運(yùn)行循環(huán),只執(zhí)行指定的時(shí)間
// [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3.0]];
//方案三
[self performSelector:@selector(TEST) withObject:nil afterDelay:0];//不開(kāi)運(yùn)行循環(huán)庆械,方法永遠(yuǎn)不會(huì)被執(zhí)行薇溃。
// [[NSRunLoop currentRunLoop] run];
// 測(cè)試哪些方法沒(méi)有運(yùn)行循環(huán)時(shí)就不會(huì)執(zhí)行
[self performSelector:@selector(TEST)];//與運(yùn)行循環(huán)無(wú)關(guān),立即執(zhí)行
[self performSelector:@selector(TEST) withObject:nil];//與運(yùn)行循環(huán)無(wú)關(guān)缭乘,立即執(zhí)行
//驗(yàn)證異步還是同步沐序,是否會(huì)自鎖?答案:異步調(diào)用,不會(huì)自鎖策幼。
[self performSelectorInBackground:@selector(TEST) withObject:nil];
NSLog(@"end");
}