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 修飾 不可變的 要看賦值**5 指定setter和getter , 就是不用系統getter 和 setter. 替換成自定義的函式(1)**是可變的話, 會自動進行深拷貝, **物件的變化不會影響我們的不可變屬性
(2)**是不可變的話,那麼就和strong一樣大膽的指標拷貝,反正都不會改變.
2、copy 修飾可變的.
那麼會生成乙個不可變物件,賦值給可變屬性,編譯沒問題,調方法修改其內容時會崩潰unrecognized selector sent to instance
3、 strong修飾不可變的 也要看**
(1)如果**是不可變的, 那就沒什麼問題
(2)如果**是可變的, 那麼當源物件的內容發生改變時,我們的不可變屬性的值也會發生改變,那麼就破壞的其封閉性, 不安全.
4、strong修飾可變的 也要看**
(1)如果**是不可變的, 那麼會直接報警告執行出錯 unrecognized selector sent to instance
(2) 如果**是可變的,那麼沒問題.
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 單...