1. 什么是arc构灸?(arc是為了解決什么問(wèn)題誕生的?)
答:ARC 是 Automatic Reference Counting 的縮寫, 即自動(dòng)引用計(jì)數(shù). 這是蘋果在 iOS5 中引入的內(nèi)存管理機(jī)制.不僅能夠降低程序崩潰和內(nèi)存泄露的風(fēng)險(xiǎn), 而且可以減少開(kāi)發(fā)者的工作量, 能夠大幅度提升程序的 流暢性 和 可預(yù)測(cè)性 .
那么ARC是為了解決什么問(wèn)題誕生的呢?這個(gè)得追溯到MRC手動(dòng)內(nèi)存管理時(shí)代說(shuō)起草描。
MRC下內(nèi)存管理的缺點(diǎn):
1.當(dāng)我們要釋放一個(gè)堆內(nèi)存時(shí)懂算,首先要確定指向這個(gè)堆空間的指針都被release了。(避免提前釋放)
2.釋放指針指向的堆空間株憾,首先要確定哪些指針指向同一個(gè)堆蝙寨,這些指針只能釋放一次。(MRC下即誰(shuí)創(chuàng)建嗤瞎,誰(shuí)釋放墙歪,避免重復(fù)釋放)
3.模塊化操作時(shí),對(duì)象可能被多個(gè)模塊創(chuàng)建和使用贝奇,不能確定最后由誰(shuí)去釋放虹菲。
4.多線程操作時(shí),不確定哪個(gè)線程最后使用完畢
2掉瞳、以下 keywords 有什么區(qū)別: assign vs weak , __block vs __weak
答:assign 用于簡(jiǎn)單的賦值, 不改變屬性的引用計(jì)數(shù)
weak 用于對(duì)象類型, 由于 weak 同樣不改變對(duì)象的引用計(jì)數(shù)且不持有對(duì)象實(shí)例, 當(dāng)該對(duì)象廢棄時(shí), 該弱引用自動(dòng)失效并且被賦值為 nil , 所以它可以用于避免兩個(gè)強(qiáng)引用產(chǎn)生的 循環(huán)引用 導(dǎo)致內(nèi)存無(wú)法釋放的問(wèn)題.
__block 和 __weak 之間的卻是確實(shí)極大的, 不過(guò)它們都用于修飾變量.
前者用于指明當(dāng)前聲明的變量在被 block 捕獲之后, 可以在 block 中改變變量的值. 因?yàn)樵?block 聲明的同時(shí)會(huì)截獲該 block 所使用的全部自動(dòng)變量的值, 而這些值只在 block 中 只具有”使用權(quán)”而不具有”修改權(quán)” . 而 __block 說(shuō)明符就為 block 提供了變量的修改權(quán).
后者是 所有權(quán)修飾符 , 什么是所有權(quán)修飾符? 這里涉及到另一個(gè)問(wèn)題, 因?yàn)樵?ARC 有效時(shí), id 類型和對(duì)象類型同 C 語(yǔ)言中的其他類型不同, 必須附加所有權(quán)修飾符. 所有權(quán)修飾符一種有 4 種:
__strong __weak __unsafe_unretained __autorelease
__weak 與 weak 的區(qū)別只在于, 前者用于變量的聲明, 而后者用于屬性的聲明.
__block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:
1.__block不管是ARC還是MRC模式下都可以使用毕源,可以修飾對(duì)象,還可以修飾基本數(shù)據(jù)類型陕习。
2.__weak只能在ARC模式下使用霎褐,也只能修飾對(duì)象(NSString),不能修飾基本數(shù)據(jù)類型(int)衡查。
3.__block對(duì)象可以在block中被重新賦值瘩欺,__weak不可以。
也就是說(shuō)拌牲,在MRC下俱饿,我們通常使用__block,而在ARC下我們通常使用__weak,或者_(dá)_unsafe_unretained __block(不安全,不建議使用)來(lái)修飾防止循環(huán)引用而造成的內(nèi)存泄露塌忽。
4拍埠、KVO,NSNotification土居,delegate及block區(qū)別
答:KVO的使用也很簡(jiǎn)單枣购,就是簡(jiǎn)單的3步嬉探。
1.注冊(cè)需要觀察的對(duì)象的屬性addObserver:forKeyPath:options:context:
2.實(shí)現(xiàn)observeValueForKeyPath:ofObject:change:context:方法,這個(gè)方法當(dāng)觀察的屬性變化時(shí)會(huì)自動(dòng)調(diào)用
3.取消注冊(cè)觀察removeObserver:forKeyPath:context:
NSNotification是通知棉圈,也是一對(duì)多的使用場(chǎng)景涩堤。在某些情況下,KVO和NSNotification是一樣的分瘾,都是狀態(tài)變化之后告知對(duì)方胎围。NSNotification的特點(diǎn),就是需要被觀察者先主動(dòng)發(fā)出通知德召,然后觀察者注冊(cè)監(jiān)聽(tīng)后再來(lái)進(jìn)行響應(yīng)白魂,比KVO多了發(fā)送通知的一步,但是其優(yōu)點(diǎn)是監(jiān)聽(tīng)不局限于屬性的變化上岗,還可以對(duì)多種多樣的狀態(tài)變化進(jìn)行監(jiān)聽(tīng)福荸,監(jiān)聽(tīng)范圍廣,使用也更靈活肴掷。
delegate 是代理敬锐,就是我不想做的事情交給別人做。比如狗需要吃飯捆等,就通過(guò)delegate通知主人滞造,主人就會(huì)給他做飯、盛飯栋烤、倒水谒养,這些操作,這些狗都不需要關(guān)心明郭,只需要調(diào)用delegate(代理人)就可以了买窟,由其他類完成所需要的操作。所以delegate是一對(duì)一關(guān)系薯定。
block是delegate的另一種形式始绍,是函數(shù)式編程的一種形式。使用場(chǎng)景跟delegate一樣话侄,相比delegate更靈活亏推,而且代理的實(shí)現(xiàn)更直觀。
KVO一般的使用場(chǎng)景是數(shù)據(jù)年堆,需求是數(shù)據(jù)變化吞杭,比如股票價(jià)格變化,我們一般使用KVO(觀察者模式)变丧。delegate一般的使用場(chǎng)景是行為芽狗,需求是需要?jiǎng)e人幫我做一件事情,比如買賣股票痒蓬,我們一般使用delegate童擎。
Notification一般是進(jìn)行全局通知滴劲,比如利好消息一出,通知大家去買入顾复。delegate是強(qiáng)關(guān)聯(lián)班挖,就是委托和代理雙方互相知道,你委托別人買股票你就需要知道經(jīng)紀(jì)人捕透,經(jīng)紀(jì)人也不要知道自己的顧客聪姿。Notification是弱關(guān)聯(lián)碴萧,利好消息發(fā)出乙嘀,你不需要知道是誰(shuí)發(fā)的也可以做出相應(yīng)的反應(yīng),同理發(fā)消息的人也不需要知道接收的人也可以正常發(fā)出消息破喻。
5虎谢、__block在arc和非arc下含義一樣嗎?
答:在非arc中曹质,block修飾的變量的引用計(jì)算是不變的婴噩。
在arc中,會(huì)引用到羽德,并且計(jì)算+1几莽;
6、使用atomic一定是線程安全的嗎宅静?
答:atomic所說(shuō)的線程安全只是保證了getter和setter存取方法的線程安全章蚣,并不能保證整個(gè)對(duì)象是線程安全的。如下列所示:
比如:@property(atomic,strong)NSMutableArray *arr;
如果一個(gè)線程循環(huán)的讀數(shù)據(jù)姨夹,一個(gè)線程循環(huán)寫數(shù)據(jù)纤垂,那么肯定會(huì)產(chǎn)生內(nèi)存問(wèn)題,因?yàn)檫@和setter磷账、getter沒(méi)有關(guān)系峭沦。如使用[self.arr objectAtIndex:index]就不是線程安全的。好的解決方案就是加鎖逃糟。
7吼鱼、描述一個(gè)你遇到過(guò)的retain cycle例子。(別撒謊绰咽,你肯定遇到過(guò))
答: MJ刷新block方法中調(diào)用的時(shí)候菇肃,用的是weakSelf.
8、+(void)load; +(void)initialize剃诅;有什么用處巷送?
答:+ initialize和+ load是 NSObject 類的兩個(gè)類方法,它們會(huì)在運(yùn)行時(shí)自動(dòng)調(diào)用矛辕,我們可以利用其特性做一些初始化操作笑跛。
initialize和load的區(qū)別在于:load是只要類所在文件被引用就會(huì)被調(diào)用付魔,而initialize是在類或者其子類的第一個(gè)方法被調(diào)用前調(diào)用。所以如果類沒(méi)有被引用進(jìn)項(xiàng)目飞蹂,就不會(huì)有l(wèi)oad調(diào)用几苍;但即使類文件被引用進(jìn)來(lái),但是沒(méi)有使用陈哑,那么initialize也不會(huì)被調(diào)用妻坝。
詳看:http://www.reibang.com/p/24fbd2e9bb28