property 後面可以有哪些修飾符?

2021-07-25 03:22:45 字數 2432 閱讀 6556

1.執行緒安全的: atomic, nonatomic

2.訪問許可權的: readonly, readwrite

3.記憶體管理(arc) assign,strong,weak,copy

4.記憶體管理(mrc)assign, retain,copy

5.指定方法名稱: setter= getter=

1.執行緒安全(系統預設是atomic)

atomic: objc使用的一種執行緒保護技術,基本上來講,是防止在寫未完成的時候被另外乙個執行緒讀取,造成資料錯誤。而這種機制是耗費系統資源的,所以在iphone這種小型裝置上,如果沒有使用多執行緒間的通訊程式設計,那麼nonatomic是乙個非常好的選擇。

nonatomic: 禁止多執行緒,變數保護,提高效能。

2.訪問許可權:

readonly 表示唯讀, 也就是修飾的屬性只有getter沒有setter

readwrite 可讀寫, 也就是修飾的屬性既有setter又有getter

3和4 我就要比較著來說了

(1)strong和 retain

相同點:

strong 和 retain 都是針對物件型別進行記憶體管理. 如果去修飾基本資料型別,xcode會直接報錯. 當給物件型別使用此修飾符時,setter方法會先將舊的物件屬性release掉,再將新的物件賦值給屬性並對該物件進行一次retain操作, 兩者都會增加物件的引用計數

不同點:

strong一般用於arc環境, retain 用於mrc環境.

(2) assign 和 weak

相同點:

assign和weak不會牽扯到記憶體管理,不會增加引用計數

不同點:

assign 可修飾基本資料型別 也可修飾oc物件, 但如果修飾物件型別指向的是乙個強指標, 當他指向的這個指標釋放後, 他仍指向這塊記憶體,必須手動給其置為nil, 否則就會產生野指標,如果還通過此指標操作那塊記憶體,便會導致exc_bad_access錯誤,呼叫了已經釋放的記憶體空間; 而weak 只能修飾oc物件, 且相對assign比較安全, 如果指向的物件消失了,那麼他會自動置為nil,不會產生野指標.

(3) copy、strong 和 可變、不可變型別

附上簡圖一張,莫見笑,歡迎各位指正:

1) copy 和 strong 都可修飾不可變型別,但一般用copy

一般用copy修飾不可變的, 因為安全, 可以保證其封閉性.

因為用copy修飾,setter方法中會自動判斷如果**,如果是不可變的,那和strong一樣,進行淺拷貝,會增加其引用計數,如果是可變的那麼就深拷貝,不會增加其引用計數. 所以如果如果專案中這樣的不可變物件(比如nsstring)多的話,當一定數量if判斷消耗的時間累加起來就會影響效能.

所以,只需要記住一點,當你給你的不可變物件 賦值時, 如果**是可變的,那麼就用copy, 如果**是不可變型別的,就用strong.

注:如果當strong修飾不可變的, 如果**是不可變得,那麼同上,沒有問題. 如果**是可變的時, 那麼當源物件變化時,我們的不可變屬性也會跟著變化,那麼就破壞了其封閉性, 就不安全了.

2) 如果用 copy 修飾 可變型別 會出現什麼問題?

copy 修飾 可變的物件的話, 會生成乙個不可變的nscfconstantsting物件,賦值給可變屬性,編譯沒問題, 調方法修改其內容時崩潰. unrecognized selector sent to instance

總結1、copy 修飾 不可變的 要看賦值**

(1)**是可變的話, 會自動進行深拷貝, **物件的變化不會影響我們的不可變屬性

(2)**是不可變的話,那麼就和strong一樣大膽的指標拷貝,反正都不會改變.

2、copy 修飾可變的.

那麼會生成乙個不可變物件,賦值給可變屬性,編譯沒問題,調方法修改其內容時會崩潰unrecognized selector sent to instance

3、 strong修飾不可變的 也要看**

(1)如果**是不可變的, 那就沒什麼問題

(2)如果**是可變的, 那麼當源物件的內容發生改變時,我們的不可變屬性的值也會發生改變,那麼就破壞的其封閉性, 不安全.

4、strong修飾可變的 也要看**

(1)如果**是不可變的, 那麼會直接報警告執行出錯 unrecognized selector sent to instance

(2) 如果**是可變的,那麼沒問題.

5 指定setter和getter , 就是不用系統getter 和 setter. 替換成自定義的函式

cookie有哪些字段可以設定

name欄位為乙個cookie的名稱。value欄位為乙個cookie的值。domain欄位為可以訪問此cookie的網域名稱。非頂級網域名稱,如二級網域名稱或者 網域名稱,設定的cookie的domain只能為頂級網域名稱或者二級網域名稱或者 網域名稱本身,不能設定其他二級網域名稱的cookie,...

css有哪些屬性可以繼承

1 字型系列屬性 font 組合字型 font family 規定元素的字型系列 font weight 設定字型的粗細 font size 設定字型的尺寸 font style 定義字型的風格 font variant 設定小型大寫字母的字型顯示文字,這意味著所有的小寫字母均會被轉換為 大寫,但是...

css有哪些屬性可以繼承

一 字型系列屬性 font family 字型系列 font weight 字型的粗細 font size 字型的大小 font style 字型的風格 二 文字系列屬性 text indent 文字縮排 text align 文字水平對齊 line height 行高 word spacing 單...