您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>通訊/手機(jī)編程>

關(guān)于iOS開(kāi)發(fā)的一些知識(shí)點(diǎn)

大?。?/span>0.2 MB 人氣: 2017-09-25 需要積分:1

1 @property

@property 是 readwrite,assign,atomic

在使用 @property 時(shí), 編譯器默認(rèn)會(huì)進(jìn)行自動(dòng) synthesize,生成 getter 和 setter,同時(shí)把 ivar 和屬性綁定起來(lái)

使用 @dynamic,顯式表示不希望編譯器生成 getter 和 setter

protocol 中定義的屬性,編譯器不會(huì)自動(dòng) synthesize,需要手動(dòng)寫(xiě)

當(dāng)重載父類中的屬性時(shí),也必須手動(dòng)寫(xiě) synthesize

2 Extension 與 Category 有如下幾點(diǎn)顯著的區(qū)別:

使用 Extension 必須有原有類的源碼

Extension 聲明的方法必須在類的主 @implementation 區(qū)間內(nèi)實(shí)現(xiàn),可以避免使用有名 Category 帶來(lái)的多個(gè)不必要的 implementation 段。

Extension 可以在類中添加新的屬性和實(shí)例變量,Category 不可以(注:在 Category 中實(shí)際上可以通過(guò)運(yùn)行時(shí)添加新的屬性,下面會(huì)講到)

3 Bolck

在 ARC 中編譯器會(huì)自動(dòng)對(duì) block 進(jìn)行 copy 操作,但是蘋(píng)果仍然建議使用 copy 來(lái)指明編譯器的行為

block 在捕獲外部變量的時(shí)候,會(huì)保持一個(gè)強(qiáng)引用,當(dāng)在 block 中捕獲 self 時(shí),由于對(duì)象會(huì)對(duì) block 進(jìn)行 copy,于是便形成了強(qiáng)引用循環(huán)

多次調(diào)用 weakSelf 的方法,有可能在 block 執(zhí)行過(guò)程中 weakSelf 變?yōu)?nil,

涉及到 weak 本身的機(jī)制了。weak 置 nil 的操作發(fā)生在 dealloc 中

最后一個(gè)持有 object 的對(duì)象被釋放的時(shí)候,會(huì)觸發(fā)對(duì)象的 dealloc,而這個(gè)持有者的釋放操作就不一定保證發(fā)生在哪個(gè)線程了。因此 block 執(zhí)行的過(guò)程中 weakSelf 有可能在另外的線程中被置為 nil。

MRC 下Block 默認(rèn)是分配在棧上的,除非進(jìn)行顯式的 copy

ARC 也更加傾向于把 Block 放到堆上

Block進(jìn)階

Block在內(nèi)存中的位置分為三種類型NSGlobalBlock,NSStackBlock, NSMallocBlock

參考資料http://blog.devtang.com/2013/07/28/a-look-inside-blocks/

4 堆和棧

堆內(nèi)存要程序員手動(dòng)回收(動(dòng)態(tài)分配和回收內(nèi)存的)

棧內(nèi)存會(huì)被系統(tǒng)自動(dòng)回收(靜態(tài)分配和動(dòng)態(tài)分配)

靜態(tài)分配是系統(tǒng)編譯器完成的,比如局部變量的分配

動(dòng)態(tài)分配是由alloc函數(shù)進(jìn)行分配的,但是棧的動(dòng)態(tài)分配和堆是不同的,它的動(dòng)態(tài)分配也由系統(tǒng)編譯器進(jìn)行釋放,不需要程序員手動(dòng)管理

只有oc對(duì)象需要進(jìn)行內(nèi)存管理

非oc對(duì)象類型比如基本數(shù)據(jù)類型不需要進(jìn)行內(nèi)存管理

棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。

堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。(堆是鏈表方式存儲(chǔ))

兩者區(qū)別

管理方式不同;(棧:自動(dòng) 堆:手動(dòng))

空間大小不同;( 棧:1M?? 32位系統(tǒng) 堆4G

能否產(chǎn)生碎片不同;(棧:后進(jìn)先出 堆:頻繁new release 大量的碎片使程序效率變低)

生長(zhǎng)方向不同;(棧: 生長(zhǎng)方向是向下的,是向著內(nèi)存地址減小的方向增長(zhǎng) 堆:相反)

分配方式不同;(棧:靜態(tài)和動(dòng)態(tài) 堆:全動(dòng)態(tài))

分配效率不同;(棧:機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門(mén)的寄存器存放棧的地址,壓棧出棧都有專門(mén)的指令執(zhí)行,這就決定了棧的效率比較高。 堆:C/C++函數(shù)庫(kù)提供的,它的機(jī)制是很復(fù)雜的,例如為了分配一塊內(nèi)存,庫(kù)函數(shù)會(huì)按照一定的算法(具體的算法可以參考數(shù)據(jù)結(jié)構(gòu)/操作系統(tǒng))在堆 內(nèi)存中搜索可用的足夠大小的空間,如果沒(méi)有足夠大小的空間(可能是由于內(nèi)存碎片太多),就有可能調(diào)用系統(tǒng)功能去增加程序數(shù)據(jù)段的內(nèi)存空間,這樣就有機(jī)會(huì)分 到足夠大小的內(nèi)存,然后進(jìn)行返回。顯然,堆的效率比棧要低得多。)

關(guān)于iOS開(kāi)發(fā)的一些知識(shí)點(diǎn)

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?