@property 關(guān)鍵字的區(qū)別:assign 與 weak、__block 與 __weak、strong 與 copy

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)引用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容