assign 與 weak 區(qū)別
assign 適用于基本數(shù)據(jù)類型,weak 適用于 NSObject 對(duì)象
Q: assign 其實(shí)可以修飾對(duì)象,那為什么不用來修飾對(duì)象呢?
被 assign 修飾的對(duì)象在釋放后,指針的地址還是存在的,也就是說指針并沒有被置為 nil,造成野指針。
Q: 為什么可以用 assign 修飾基本數(shù)據(jù)類型?
基本數(shù)據(jù)類型一般分配在棧上,棧中的內(nèi)存是有系統(tǒng)自動(dòng)管理的,不會(huì)造成野指針
weak 修飾的對(duì)象在釋放后,指針地址會(huì)被置為 nil。
weak 使用場(chǎng)景
- Block 中。ARC 下,有可能會(huì)出現(xiàn)循環(huán)引用的情況,為了避免循環(huán)引用,可以使用 weak 來解決。如 delegate 代理屬性,常用 weak 關(guān)鍵字
- IBOutlet 控件屬性中。自身已經(jīng)進(jìn)行一次強(qiáng)引用,沒有必要再強(qiáng)引用一次,所以可以使用 weak。
strong 與 copy 區(qū)別
- strong 與 copy 都會(huì)使引用計(jì)數(shù)加 1,但 strong 兩指針指向同一個(gè)內(nèi)存地址,copy 會(huì)在內(nèi)存里拷貝一份對(duì)象,兩個(gè)指針指向不同的內(nèi)存地址。
淺拷貝與深拷貝
淺拷貝后的內(nèi)容與原始內(nèi)容指針地址相同
深拷貝后的內(nèi)容指向原始內(nèi)容相關(guān)對(duì)象的一份拷貝,與原始內(nèi)容指針地址不同(深拷貝會(huì)逐個(gè)元素發(fā)送 copy 消息,用拷貝得到的元素創(chuàng)建 set)
簡(jiǎn)而言之,淺拷貝為指針拷貝,深拷貝為內(nèi)容拷貝
[immutableObject copy]; // 淺拷貝
[immutableObject mutableCopy]; // 深拷貝
[mutableObject copy]; // 深拷貝
[mutableObject mutableCopy]; // 深拷貝
__block 與 __weak 區(qū)別
__block 修飾的變量,在 block 代碼塊中可以被修改
__weak 修飾的變量不會(huì)在 block 塊中被 retain
__weak typedof(self) weakSelf = self;
block 變量定義是為什么用 copy?block 放在哪里?
block 本身也是一個(gè)對(duì)象。block 在創(chuàng)建的時(shí)候,內(nèi)存地址是分配在棧上的,可能被隨時(shí)回收。
block 本身的作用域是屬于創(chuàng)建時(shí)的作用域,在創(chuàng)建時(shí)候的作用域外調(diào)用 block 會(huì)導(dǎo)致程序崩潰。
copy 可以將 block 拷貝到堆中,保證 block 的聲明域外可使用
棧 stack 和 堆 heap
stack
heap
.bss
.data
.text
棧區(qū)
LIFO,系統(tǒng)自動(dòng)分配。
一般放函數(shù)參數(shù)值、局部變量的值等。編譯器自動(dòng)創(chuàng)建和釋放。
堆區(qū)
可以自己申請(qǐng)內(nèi)存創(chuàng)建大小,也需自己釋放。
block 為什么不用 strong
如果 block 用到 self,就會(huì) retain self,如果是 strong 修飾的話,會(huì)造成循環(huán)引用。