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