第二季|高級進(jìn)階

1.KVC挠锥、KVO

2.runtime

3.block

4.GCD

5.RunLoop

1.Runloop是ios中一個非常重要的機(jī)制 致扯,ios系統(tǒng)底層很多模塊都通過Runloop機(jī)制來 實(shí)現(xiàn)的挎塌。例如界面更新,事件響應(yīng)等...

2.每條線程都有唯一對應(yīng)的Runloop對象婚瓜,Runloop在第一次獲取時創(chuàng)建,在線程結(jié)束時銷毀.本質(zhì)就是EventLoop的do? while循環(huán)

3.ios系統(tǒng)提供了兩種Runloop:NSRunLoop和CFRunLoopRef. CFRunLoopRef是在CoreFoundation框架內(nèi)提供了C函數(shù)的API轩性,這些API都是線程安全的. NSRunLoop是基于CFRunLoopRef的封裝,提供了面向?qū)ο蟮腁PI,不是線程安全的

4.CFRunLoopModeRef的運(yùn)行模式

kCFRunLoopDefaultMode:App的默認(rèn)運(yùn)行模式狠鸳,通常主線程是在這個運(yùn)行模式下運(yùn)行

UITrackingRunLoopMode:跟蹤用戶交互事件(用于 ScrollView 追蹤觸摸滑動揣苏,保證界面滑動時不受其他Mode影響)

UIInitializationRunLoopMode:在剛啟動App時第進(jìn)入的第一個 Mode,啟動完成后就不再使用

GSEventReceiveRunLoopMode:接受系統(tǒng)內(nèi)部事件碰煌,通常用不到

kCFRunLoopCommonModes:偽模式舒岸,不是一種真正的運(yùn)行模式(后邊會用到)


5.RunLoop與Autoreleasepool

RunLoop寄生于線程,一個線程只能有唯一對應(yīng)的RunLoop,但可以嵌套子RunLoops.自動釋放池寄生于RunLoop,程序啟動后芦圾,主線程注冊了兩個Observer監(jiān)聽RunLoop的進(jìn)出與休眠。一個最高優(yōu)先級OB檢測Entry狀態(tài)俄认,一個最低優(yōu)先級OB監(jiān)聽BeforeWaiting狀態(tài)和Exit狀態(tài).

備注:運(yùn)行循環(huán)結(jié)束前會釋放自動釋放池个少,還有池子滿了也會銷毀.

五、coreData

多線程處理大量數(shù)據(jù)同步時的操作

搭建coreData多線程環(huán)境

1.NSManagedObjectContext指定并發(fā)模式

2.NSConfinementConcurrencyType:向后兼容 IOS9后廢棄

3.NSPrivateQueueConcurrencyType:私有隊(duì)列中創(chuàng)建并管理Context

4.NSMainQueueCurrencyType:Context與UI相關(guān)用這種模式

大量數(shù)據(jù)處理

大量數(shù)據(jù)意味著需要我們關(guān)注內(nèi)存占用和性能眯杏,寫代碼時需要記得一下規(guī)劃:

1.盡可能緩存需要的數(shù)據(jù)夜焦,不相關(guān)的數(shù)據(jù)保持faults狀態(tài)

2.fetch時盡可能精準(zhǔn),少引入不相關(guān)的數(shù)據(jù)

3.構(gòu)建多context時盡量將同類managed object集中岂贩,最大限度減少合并需求

4.提升操作效率茫经,對asynchronous fetch, batch update,batch delete等新特性盡可能利用

CoreData是Cocoa處理數(shù)據(jù)綁定的方案之一,提供完整的對象持久化存儲方案.

CoreData與多線程交互的時候每個線程必須擁有一個ManagerContext

1.每個線程使用私有managerContext共享一個PersistentStoreCoordinator

2.每個線程使用私有managerContext和私有的PersistentStoreCoordinator

推薦使用第一種萎津,第二種消耗過多內(nèi)存


?

六卸伞、線程鎖

鎖是常用的同步工具,一段代碼在同一時間只能被一個線程訪問

1.NSLock:互斥鎖 lock unlock trylock

2.@synchronized:代碼塊

3.dispatch-semaphore_t:信號量? 支持信號通知與信號等待锉屈,每發(fā)送一個信號通知荤傲,信號+1;每發(fā)送一個信號等待信號-1


七颈渊、weak

weak實(shí)現(xiàn)原理可概括為三步

1.初始化:runtime調(diào)用objc_initweak函數(shù)遂黍,初始化一個新的weak指針指向?qū)ο蟮牡刂?

2.添加引用:objc_initweak函數(shù)會調(diào)用objc_storeWeak()函數(shù)從而更新指針指向,創(chuàng)建對應(yīng)弱引用表

3.釋放:調(diào)用clearDeallocating函數(shù).clearDeallocating函數(shù)首先根據(jù)對象地址獲取所有weak指針地址的數(shù)組,然后遍歷這些數(shù)組將其中數(shù)據(jù)置為nil.最后把這個entry從weak表中刪除俊嗽,最后清理對象的記錄

從實(shí)現(xiàn)中可以看出雾家,Weak指針的使用涉及到Hash表的增刪改查,存在一定的性能開銷.Weak指針盡量用Strong绍豁,倒不是擔(dān)心形成野指針芯咧,因?yàn)槟闶褂昧薟eak指針,對象就會被加入到autoreleasepool中,可以放心使用.是為了防止一次又一次加入autoreleasepool,存在性能開銷唬党。


八鹃共、談?wù)勀銓ψ詣俞尫懦氐睦斫?/h4>

1.自動釋放池是OC提供的一種自動回收機(jī)制,具有延時釋放的特性驶拱,即當(dāng)我們創(chuàng)建一個對象霜浴,并把它加入自動釋放池中,不會立即釋放蓝纲,會等到一次runloop結(jié)束或者作用域超出{}或者超出【pool release】之后再被釋放

2.Runloop寄生于線程:一個線程只能有唯一對應(yīng)的Runloop,可以嵌套子Runloops

3.自動釋放池寄生于Runloop:程序啟動后阴孟,主線程注冊了兩個Observer監(jiān)聽Runloop的進(jìn)出與睡覺。一個最高優(yōu)先級的OB監(jiān)聽Entry狀態(tài)税迷;一個最低優(yōu)先級的OB監(jiān)聽BeforeWaiting狀態(tài)和Exit狀態(tài)

線程(創(chuàng)建)--》runloop將進(jìn)入--》最高優(yōu)先級OB創(chuàng)建釋放池--》runloop將睡--》最低優(yōu)先級的OB銷毀舊線程池創(chuàng)建新池--》runloop將退出--》最低優(yōu)先級OB銷毀新池--》線程(銷毀)

4.默認(rèn)主線程運(yùn)行循環(huán)(runloop)是開啟的永丝,子線程的運(yùn)行循環(huán)(runloop)默認(rèn)是不開啟的,也就意味著子線程不會創(chuàng)建autoreleasepool,所以需要我們自己在子線程中創(chuàng)建自動釋放池箭养。

7.自動釋放池在mrc和arc的區(qū)別

自動釋放池mac與arc

8.多層自動釋放池嵌套的對象在哪一層釋放

最內(nèi)層釋放

9.對于block慕嚷,理解,mrc和arc下有什么區(qū)別毕泌,使用注意事項(xiàng)

block的理解

1.MRC環(huán)境下,在定義block為屬性時,使用copy的原因,是把block從棧區(qū)拷貝到堆區(qū),因?yàn)闂^(qū)中的變量出了作用域之后就會被銷毀,無法在全局使用,所以應(yīng)該把棧區(qū)的屬性拷貝到堆區(qū)中全局共享,這樣就不會被銷毀了,在MRC手動管理的就是堆區(qū),不需要系統(tǒng)管理,MRC環(huán)境必須使用copy把變量拷貝到全局的堆區(qū)

2.如果是ARC的環(huán)境下,就可以不使用copy修飾,因?yàn)锳RC下的屬性本來就在堆區(qū)

3.很早的時候MRC的block屬性都是在棧區(qū)的,copy之后就到堆區(qū)了

4.當(dāng)前的ARC的block屬性默認(rèn)都在堆區(qū),使用copy知識沿襲了歷史的習(xí)慣,使用strong也是沒有問題的

__block修飾符

1.在block內(nèi)部喝检,訪問外部的變量時,內(nèi)部會對外部的變量進(jìn)行一次拷貝撼泛,在block內(nèi)部操作的是拷貝之后的副本挠说,不會影響外部的變量,這個變量的堆區(qū)愿题。

2.在block內(nèi)部损俭,修改外部變量,是不被允許的潘酗,非要修改要用__block

3.一旦外部的int變量(在棧區(qū))被__block標(biāo)記了杆兵,如果block內(nèi)部修改了這個變量,那么這個變量的地址會永久的被修改在堆區(qū)

4.為什么在block內(nèi)部不能修改外部的變量崎脉?

因?yàn)閎lock一般是需要傳遞給另外一個類里面,block內(nèi)部的一些變量不能存儲在棧區(qū),需要存在堆區(qū),不然數(shù)據(jù)就容易丟失,這就是使用__block修飾的原因,這樣傳輸數(shù)據(jù)的時候,數(shù)據(jù)就不會丟失

5.weak原理


6.如果屬性完全不加修飾詞入weak拧咳,atomic,系統(tǒng)會怎么處理


七囚灼、線程間通信

八骆膝、數(shù)據(jù)庫如何實(shí)現(xiàn)讀寫分離

九、UITableview優(yōu)化

?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灶体,一起剝皮案震驚了整個濱河市阅签,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝎抽,老刑警劉巖政钟,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件路克,死亡現(xiàn)場離奇詭異,居然都是意外死亡养交,警方通過查閱死者的電腦和手機(jī)精算,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碎连,“玉大人灰羽,你說我怎么就攤上這事∮阏蓿” “怎么了廉嚼?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長倒戏。 經(jīng)常有香客問我怠噪,道長,這世上最難降的妖魔是什么杜跷? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任傍念,我火速辦了婚禮,結(jié)果婚禮上葛闷,老公的妹妹穿的比我還像新娘捂寿。我一直安慰自己,他們只是感情好孵运,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蔓彩,像睡著了一般治笨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赤嚼,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天旷赖,我揣著相機(jī)與錄音,去河邊找鬼更卒。 笑死等孵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹂空。 我是一名探鬼主播俯萌,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼上枕!你這毒婦竟也來了咐熙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤辨萍,失蹤者是張志新(化名)和其女友劉穎棋恼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爪飘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年义起,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片师崎。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡默终,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抡诞,到底是詐尸還是另有隱情穷蛹,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布昼汗,位于F島的核電站肴熏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏顷窒。R本人自食惡果不足惜蛙吏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鞋吉。 院中可真熱鬧鸦做,春花似錦、人聲如沸谓着。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赊锚。三九已至治筒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舷蒲,已是汗流浹背耸袜。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牲平,地道東北人堤框。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像纵柿,于是被迫代替她去往敵國和親蜈抓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,070評論 25 707
  • 不要聽信任何人的絕對判斷藐窄,他有不是上帝他怎么能知道結(jié)果呢资昧,無非他做了只是沒有成功罷了,所以也只能告訴你這件事做不成...
    大牙牙53閱讀 128評論 0 0
  • 考研兄你好荆忍! 兄弟聽說你要考研格带,恭喜你做了你人生中第一個重大決定撤缴,不過作為經(jīng)歷過你人生中第一個轉(zhuǎn)折點(diǎn)的我想要給你說...
    Jachinzhao閱讀 323評論 2 6
  • 我所渴求的,無非是將心中脫穎而出的本性付諸生活叽唱。為什么竟如此艱難呢屈呕? 我并沒有以激烈的抗?fàn)幏绞礁鎰e父母和他們的世界...
    蕭言君閱讀 1,316評論 0 0
  • 50年前,我們還不知道互聯(lián)網(wǎng)是什么棺亭,20年前中國的互聯(lián)網(wǎng)才剛剛發(fā)芽虎眨,互聯(lián)網(wǎng)巨頭在當(dāng)年才剛剛成立,滿腔熱血的做著黃頁...
    獅子搞畫藝閱讀 226評論 0 0