Objective-C 屬性詳解
最近在學習 Objective-C 的語法,過程中發現 ObjC 對於屬性的定義不像 Swift 來得那麼簡單,很多東西我們都必須自己親自設定,不然可能會造成存取到一個已經被釋放的記憶體位置,或是 Retain cycle 的狀況發生。
下面來跟大家介紹一下幾種組合,順便也自己做一下筆記
- [ atomic / nonatomic ]
第一組這兩個屬性設定主要是用在規範這個變數可以同時被幾個執行緒存取,如果選擇 atomic ,則表示該變數同時間只可以被一條執行緒讀取,以及一條執行緒修改, atomic 只能保證你一定會有值,可是回來的時候是修改前的還是修改後的就不一定了。
而至於 nonatomic 則表示同時間可以提供給多執行緒進行讀寫的動作,存取的效率會比較快,但其沒辦法保證是否一定會有值回來,如果同時間有不同執行緒對該變數進行讀或寫的動作,則可能會導致 app crash.
2. [ strong / weak / assign / copy ]
這類的部分與 ARC 記憶體管理比較有相關,strong 就很像在 Swift 當中宣告一個變數,該變數會牽著一條線到某一個系統分配的記憶體位置,使其 Reference counting + 1 ,則該記憶體位置就不會被 ARC 回收。
如果是 weak 的話,一樣也是牽起了一條線,只是這是一條虛線!表示當你去存取這個變數時,雖然也可以存取到一樣的記憶體位置,可是卻不會使其 Reference Counting + 1, 主要是用來避免 retain cycle 的狀況發生。
assign 的話則用於原始的型別,像是 int, float 等等,但我自己的理解是,使用 weak 修飾的變數,可以接受是 nil, 但如果是 assign 的話,則必須確保一定有值,不能是 nil
最後則是 copy, 人如其名啊!copy 則是把該記憶體位置時記得複製一份出來給新變數做使用,並且讓變數擁有那個新複製出來的物件,而不會讓原本的那份 reference counting +1.
3. [ readwrite / readonly ]
針對這類我覺得看名字就很清楚了,一個是定義可讀可寫,另外一個則是只可讀。但是這邊的可讀是連在自己的class 當中都只可讀,所以我在查資料的時候有看到一種寫法是先在 interface 當中宣告一個屬性可讀,如果在implementation 當中需要修改到該屬性的時候,再寫一個 extension 來修改屬性的狀態,使其可以被修改。
4. [ nullable / nonnull ]
這類修飾詞的話就很像 Swift 當中的可否接受一個變數是 nil, 有點像是 optional 那樣的修飾詞。
當我們直接去宣告一個變數,沒有加上任何修飾詞的時候,其實預設的狀況會是向下列這樣。
atomic + strong + readwrite + nullable
以上解釋分享給大家,如果有錯誤的地方還請讓我知道啊~~