總結一下關於屬性關鍵字的用法與區別

2021-08-26 09:12:43 字數 1920 閱讀 7816

最近老有朋友問我一些關於oc中宣告屬性中關鍵字的細節使用,第一為了梳理下自己的思路為了日後好查詢,第二為了省事就寫一篇這個總結文章吧。

宣告乙個屬性的過程中,一共分三類關鍵字:讀寫許可權關鍵字,原子性關鍵字以及引用計數關鍵字

1.讀寫許可權關鍵字:readonly,readwirte,預設是readwirte,顧名思義就不過多解釋了

2.原子性關鍵字:atomic,nonatomic,預設是atomic原子性。這裡區分一下atomic與nonatomic的區別,atomic保證了原子內部的執行緒安全,其實本質上也就是給屬性的setter方法中加了乙個執行緒鎖,要知道oc內部實現時是用mrc實現的,所以自然在setter方法中也有retain與release方法的呼叫,使用atomic關鍵字的好處就是當多條執行緒訪問同乙個屬性的時候,只有一條執行緒能夠進行操作,這樣就避免了在多條執行緒操作屬性時,一條執行緒執行到了release方法另一條執行緒又拿到相關物件造成的空指標報錯問題(這只是其中乙個好處),但壞處就是會耗效能,而且大多數情況下用不到,而且在一些比較複雜的情況下的時候,atomic也並不能提現出比nonatomic更多的優勢,所以一般使用的是效能更高的nonatomic關鍵字

3.引用計數關鍵字:1.retain/strong 2.assgin/unsafe_unretained 3.weak 4.copy

對於這四個引用計數的關鍵字retain和unsafe_unretained都是mrc中用的,就不過多解釋了

1.先從strong開始寫起,strong就代表給物件賦值的時候賦予物件的是乙個指標,會使給物件賦值的那個物件引用計數+1,不會開闢新的記憶體空間,一般用於例項變數。

2.assgin一般是乙個修飾基本資料型別的關鍵字,當然也可以修飾物件,使用assgin關鍵字不會增加其引用計數,但是當指向的物件被釋放的時候,會產生乙個懸浮指標,仍然指向空位址,這樣就會造成記憶體洩漏或者野指標之類常見的不必要的麻煩

3.weak和assgin關鍵字很相似,但是weak只能是乙個修飾物件的關鍵字,不能修飾基本資料型別,使用weak不會使物件的引用計數+1,但weak修飾的物件在被釋放的時候不會產生乙個懸垂指標,只會將物件置為nil

其實這裡就解釋了為什麼一般破迴圈引用的環是用weak而不是用assgin了,也做了assgin和weak的區別了

4.copy關鍵字指的是拷貝,但是具體是深拷貝還是淺拷貝要聯絡上下文決定,稍後我詳細寫。一般情況下是將乙個物件記憶體中的內容拷貝乙份,重新開闢一塊新的空間進行賦值,再將引用copy關鍵字的屬性指向這塊區域。使用copy關鍵字會新開闢一塊記憶體區域,但不會使賦值的物件引用計數+1。

所以引用計數的4個關鍵字就解釋完了,下面來區分一下拷貝中使用的mutablecopy和copy的區別:

首先,需要使用這兩個方法必須在類中遵守nscopying或者nsmutablecopying協議,不然會報錯。

然後對於不同的情況,拷貝的結果和拷貝的方式都有不同,詳細列舉一下:

首先對於可變物件來說:

使用mutablecopy產生的結果是乙個可變物件,並且會使用深拷貝的拷貝方式進行拷貝,

使用copy產生的結果是乙個不可變物件,並且也會使用深拷貝的方式進行拷貝。

對於不可變物件來說:

使用mutablecopy產生的結果也是乙個可變的物件,並且也會採用深拷貝的方式進行拷貝,

使用copy的話產生的結果是乙個不可變的物件,但是,拷貝方式就會採用淺拷貝來進行拷貝了。

這四種情況就代表了各種情況下拷貝物件的拷貝方式與拷貝結果的不同,大家可以梳理一下,其實不是很繞,

我自己總結了一下就是,使用mutablecopy拷貝出來的結果絕壁是可變的,而且是採用深拷貝的方式,但是使用copy就分情況了,他拷貝出來的東西絕壁是不可變的,但是對於可變物件來說使用的就是深拷貝的方式,對於不可變的物件就會採用淺拷貝方式拷貝指標,這樣總結就比較好記了。

所以使用copy的時候切記要小心,心裡要明記上面的情況,尤其開發中對於可變物件的拷貝一定要小心,不然就會產生crash等結果,比較蛋疼。

關鍵字 一些關鍵字用法總結

register 用register宣告的變數稱暫存器變數,在可能的情況下會直接存放在機器的暫存器中 但對32位編譯器不起作用,當global optimizations 全域性優化 開的時候,它會做出選擇是否放在自己的暫存器中 不過其它與register關鍵字有關的其它符號都對32位編譯器有效。c...

整理一下幾個關鍵字

今天學了幾個關鍵字,了解了它們的用法,在接下來的學習中還需要繼續熟悉練習。static 2 區域性靜態變數 侷限於特定函式,但出作用於不釋放,在函式體內的靜態變數的值也能夠維持。4 存放位置 程式開始時,存放在全域性資料區,結束時釋放空間 const const修飾的值是唯讀的變數。1 修飾唯讀變數...

關鍵字的用法 C 中const關鍵字用法總結

ark2000 看完了c primer的基礎篇,對const還是有點陌生,在這裡小小地總結一下吧。在變數的定義前加上const修飾符即可完成const物件的建立。const int val 5 const變數的值不能改變。val 5 error assignment of read only var...