1.weak與assign的區(qū)別?
在MRC環(huán)境下 使用retain 修飾對(duì)象類型,使用assin實(shí)現(xiàn)基本數(shù)據(jù)類型屈张。
在ARC環(huán)境下剩胁,strong相當(dāng)于retain诉植,weak相當(dāng)于assign,但是weak只能修飾對(duì)象類型昵观,而assign使用修飾基本數(shù)據(jù)類型晾腔。weak是一種弱引用。
assign是指針賦值啊犬,不對(duì)引用計(jì)數(shù)操作灼擂,使用之后如果沒有置為nil,可能就會(huì)產(chǎn)生野指針觉至;而weak一旦不進(jìn)行使用后剔应,永遠(yuǎn)不會(huì)使用了,就不會(huì)產(chǎn)生野指針语御!
2.strong與copy的區(qū)別峻贮?
在定義一個(gè)類property的時(shí)候,為property選擇strong還是copy的時(shí)候需要特別注意应闯,如果property是NSArray或是NSString及其子類的時(shí)候纤控,最好選擇copy屬性修飾,為什么呢碉纺?這時(shí)為了防止賦值給它的可變數(shù)據(jù)船万,如果可變的數(shù)據(jù)發(fā)生了變化刻撒,那么該property也會(huì)發(fā)生變化。
(1) strong對(duì)應(yīng)的setter方法耿导,是將_property先release(_property release)声怔,然后將參數(shù)retain(property retain),最后是_property = property碎节。
(2) copy對(duì)應(yīng)的setter方法捧搞,是將_property先release(_property release),然后拷貝參數(shù)內(nèi)容(property copy)狮荔,創(chuàng)建一塊新的內(nèi)存地址胎撇,最后_property = property
3.多線程GCD的簡(jiǎn)述
GCD是iOS4.0推出的,主要針對(duì)多核cpu做了優(yōu)化殖氏,是c語言的技術(shù)
GCD是將任務(wù)(block)添加到隊(duì)列(串行/并行/全局/主隊(duì)列)并且以同步/異步的方式執(zhí)行任務(wù)的函數(shù)晚树,任務(wù)的取出遵循隊(duì)列FIFO原則:先進(jìn)先出,后進(jìn)后出
GCD提供了一些NSOperation不具備的功能
一次性執(zhí)行:可以保證某一段代碼在程序運(yùn)行的過程中只被執(zhí)行一次雅采,一次性執(zhí)行是線程安全的爵憎,在多線程環(huán)境下也是只執(zhí)行一次,應(yīng)用場(chǎng)景:設(shè)計(jì)單例模式
延遲執(zhí)行:即實(shí)現(xiàn)等待多長(zhǎng)時(shí)間后在哪個(gè)隊(duì)列中執(zhí)行什么代碼塊
調(diào)度組:監(jiān)聽一組異步任務(wù)執(zhí)行結(jié)束之后婚瓜,我們能夠得到統(tǒng)一的通知宝鼓,注意:在其調(diào)度組內(nèi)的任務(wù)執(zhí)行完畢后執(zhí)行后面的“刷新主界面”與“玩完”之間的執(zhí)行沒有先后順序
(2)NSOperation
NSOperation是iOS2.0推出的,iOS4.0之后重寫了NSOperation
NSOperation將操作(異步任務(wù))添加到隊(duì)列(并發(fā)隊(duì)列)就會(huì)執(zhí)行制定操作的方法
NSOperation里提供的方便操作
最大并發(fā)數(shù)
隊(duì)列的暫停/繼續(xù)
取消隊(duì)列中所有的操作
指定操作之間的依賴關(guān)系(GCD可以用同步實(shí)現(xiàn)巴刻,但是比較麻煩)
同步和異步?jīng)Q定了要不要開啟新的線程(同步不開愚铡,異步開)
同步:在當(dāng)前線程中執(zhí)行任務(wù),不具備開啟新線程的能力
異步:在新線程中執(zhí)行任務(wù)胡陪,具備開啟新線程的能力
串行和并發(fā)決定了任務(wù)的執(zhí)行方式
并發(fā):多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行
串行:一個(gè)任務(wù)執(zhí)行完畢后沥寥,再執(zhí)行下一個(gè)任務(wù)
當(dāng)任務(wù)是異步的時(shí)候,隊(duì)列決定了開啟多少條線程
串行隊(duì)列:只開啟一條
并發(fā)隊(duì)列:可以開啟多條
主隊(duì)列特點(diǎn):主隊(duì)列中的任務(wù)柠座,只有主線程在空閑的時(shí)候才會(huì)調(diào)度任務(wù)執(zhí)行
主隊(duì)列又叫全局串行隊(duì)列邑雅,程序啟動(dòng)的時(shí)候就創(chuàng)建了主隊(duì)列,在使用的不需要?jiǎng)?chuàng)建妈经,直接GET淮野。主隊(duì)列中的任務(wù)是要在主線程執(zhí)行的。
主隊(duì)列吹泡,異步任務(wù)
不開線程录煤,同步執(zhí)行
主隊(duì)列,同步執(zhí)行
程序執(zhí)行不出來(死鎖)
死鎖的原因荞胡,當(dāng)程序執(zhí)行到下面這段代碼的時(shí)候
主隊(duì)列:如果主線程正在執(zhí)行代碼,就不調(diào)度任務(wù)
同步執(zhí)行:如果第一個(gè)任務(wù)沒有執(zhí)行了嚎,就繼續(xù)等待第一個(gè)任務(wù)執(zhí)行完成泪漂,再執(zhí)行下一個(gè)任務(wù)廊营,此時(shí)互相等待,程序無法往下執(zhí)行(死鎖)
主隊(duì)列和串行隊(duì)列的區(qū)別
串行隊(duì)列:必須等待一個(gè)任務(wù)執(zhí)行完成萝勤,再調(diào)度另一個(gè)任務(wù)
主隊(duì)列:以先進(jìn)先出調(diào)度任務(wù)露筒,如果主線程上有代碼執(zhí)行,主隊(duì)列不會(huì)調(diào)度任務(wù)
主隊(duì)列敌卓,同步執(zhí)行 ->放入異步執(zhí)行解決死鎖
全局隊(duì)列本質(zhì)就是并發(fā)隊(duì)列
全局隊(duì)列和并發(fā)隊(duì)列的區(qū)別
并發(fā)隊(duì)列有名稱慎式,可以跟蹤錯(cuò)誤,全局隊(duì)列沒有
全局隊(duì)列在ARC中不需要考慮釋放內(nèi)存趟径,
并發(fā)隊(duì)列在MRC中需要手動(dòng)釋放內(nèi)存瘪吏,因?yàn)椴l(fā)隊(duì)列是creat創(chuàng)建出來的 在MRC見到creat就要release,全局隊(duì)列不需要release
一般我們使用全局隊(duì)列蜗巧,因?yàn)槭褂闷饋砀雍?jiǎn)單
《3.》綜合比較其各自使用范圍如下
性能1.GCD更接近底層掌眠,而NSOperationQueue則更高級(jí)抽象,所以GCD在追求性能的底層操作來說幕屹,是數(shù)度最快的蓝丙。著取決于使用instruments進(jìn)行代碼性能分析,如果有必要的話
2望拖,從異步操作之間的事務(wù)性渺尘,順序性,依賴關(guān)系说敏。GCD需要自己寫更多的代碼來實(shí)現(xiàn)鸥跟,而NSOperaitonQueue已經(jīng)內(nèi)建了這些支持
3.如果異步操作的過程需要更多的被交互和UI呈現(xiàn)出來,NSOperationQueue會(huì)是一個(gè)更好的選擇像云。底層代碼中锌雀,任務(wù)之間不太互相依賴,而需要更高的并發(fā)能力迅诬,GCD 則更有優(yōu)勢(shì)腋逆!