iOS關鍵詞weak和assign的區別

2022-08-02 21:45:10 字數 2583 閱讀 6764

首先說說在什麼情況下使用 weak 關鍵字

1、arc中,在有可能出現迴圈引用的時候,往往要通過讓其中一端使用weak來解決,比如:delegate 的**屬性。

2、自身已經對它有過一次強引用,所以沒有必要再強引用一次。這個時候也會使用weak;還有就是自定義iboutlet控制項屬性一般也使用weak,一般情況也可以使用strong。

那麼weak和assign有什麼不同呢?

1、weak的特質表明,該屬性定義了一種「非擁有關係」 (nonowning relationship)。為這種屬性設定新值時,設定方法既不保留新值,也不釋放舊值。此特質同assign類似, 但是在屬性所指向的物件被摧毀時,屬性值也會清空(nil out)。 但是assign的「設定方法」只會執行針對「純量型別」 (scalar type,例如 cgfloat 或 nslnteger 等)的簡單賦值操作。

2)assigin可以用於非oc物件,但是weak必須用於oc物件。

1.修飾變數型別的區別

weak只可以修飾物件。

如果修飾基本資料型別,編譯器會報錯-「property with 『weak』 attribute must be of object type」。

assign可修飾物件,和基本資料型別。

當需要修飾物件型別時,mrc時代使用unsafe_unretained。當然,unsafe_unretained也可能產生野指標,所以它名字是"unsafe_」。

2.是否產生野指標的區別

weak不會產生野指標問題。因為weak修飾的物件釋放後(引用計數器值為0),指標會自動被置nil,之後再向該物件發訊息也不會崩潰。 weak是安全的。

assign如果修飾物件,會產生野指標問題;如果修飾基本資料型別則是安全的。修飾的物件釋放後,指標不會自動被置空,此時向物件發訊息會崩潰。

都可以修飾物件型別,但是assign修飾物件會存在問題。

assign適用於基本資料型別如int,float,struct等值型別,不適用於引用型別。因為值型別會被放入棧中,遵循先進後出原則,由系統負責管理棧記憶體。而引用型別會被放入堆中,需要我們自己手動管理記憶體或通過arc管理。

weak適用於delegate和block等引用型別,不會導致野指標問題,也不會迴圈引用,非常安全。

首先說說在什麼情況下使用 weak 關鍵字

1、arc中,在有可能出現迴圈引用的時候,往往要通過讓其中一端使用weak來解決,比如:delegate 的**屬性。

2、自身已經對它有過一次強引用,所以沒有必要再強引用一次。這個時候也會使用weak;還有就是自定義iboutlet控制項屬性一般也使用weak,一般情況也可以使用strong。

那麼weak和assign有什麼不同呢?

1、weak的特質表明,該屬性定義了一種「非擁有關係」 (nonowning relationship)。為這種屬性設定新值時,設定方法既不保留新值,也不釋放舊值。此特質同assign類似, 但是在屬性所指向的物件被摧毀時,屬性值也會清空(nil out)。 但是assign的「設定方法」只會執行針對「純量型別」 (scalar type,例如 cgfloat 或 nslnteger 等)的簡單賦值操作。

2)assigin可以用於非oc物件,但是weak必須用於oc物件。

1.修飾變數型別的區別

weak只可以修飾物件。

如果修飾基本資料型別,編譯器會報錯-「property with 『weak』 attribute must be of object type」。

assign可修飾物件,和基本資料型別。

當需要修飾物件型別時,mrc時代使用unsafe_unretained。當然,unsafe_unretained也可能產生野指標,所以它名字是"unsafe_」。

2.是否產生野指標的區別

weak不會產生野指標問題。因為weak修飾的物件釋放後(引用計數器值為0),指標會自動被置nil,之後再向該物件發訊息也不會崩潰。 weak是安全的。

assign如果修飾物件,會產生野指標問題;如果修飾基本資料型別則是安全的。修飾的物件釋放後,指標不會自動被置空,此時向物件發訊息會崩潰。

都可以修飾物件型別,但是assign修飾物件會存在問題。

assign適用於基本資料型別如int,float,struct等值型別,不適用於引用型別。因為值型別會被放入棧中,遵循先進後出原則,由系統負責管理棧記憶體。而引用型別會被放入堆中,需要我們自己手動管理記憶體或通過arc管理。

weak適用於delegate和block等引用型別,不會導致野指標問題,也不會迴圈引用,非常安全。

在IOS 4 3 支援weak關鍵詞

下面介紹一下這個庫 plweakcompatibility是一組實現了objective c執行時函式的stubs,編譯器用它來實現 weak關鍵字。如果系統實現了真正的執行時函式,plweakcompatibility會直接呼叫。如果沒有,plweakcompatibility則會呼叫自己庫內的實...

IOS宣告屬性關鍵詞

atomic 原子操作 原子性是指事務的乙個完整操作,操作成功就提交,反之就回滾.原子操作就是指具有原子性的操作 在objective c 屬性設定裡面預設的就是atomic 意思就是setter getter函式是乙個原子操作,如果多執行緒同時呼叫setter時,不會出現某乙個執行緒執行完sett...

關鍵詞密度

百科名片 目錄 隱藏 什麼是增加keywords密度的最好方式 關鍵字堆砌 keyword stuffing 的定義 關鍵字堆砌 keyword stuffing 關鍵字堆砌 keyword stuffing 是指在乙個網頁中非常密集地放置關鍵字。一般說來,如果關鍵字的出現過於頻繁,就會蓋過網頁的其...