iOS那些屬性修飾詞

最熟悉的陌生人 ? 應該是最熟悉的熟悉人??
atomic, nonatomic, assign, weak, strong, copy, retain, nullable, nonnull, readwrite, readonly

  • nonatomic

    非原子屬性, 非線程安全的, 對性能損耗低, 開發中一般用nonatomic, 系統默認是atomic, 所以每次都要用nonatomic去修飾屬性.

  • atomic

    原子屬性, 系統自動在setter和getter方法加了鎖, 性能損耗高, 開發中一般不用.

  • assign

    修飾基本數據類型(NSInteger/Float/Double/Bool...), 基本數據類型分配在棧中, 內存由系統管理. 若修飾對象類型, 再訪問對象會報錯野指針錯誤, 對象類型分配在堆中, 而assign不進行強引用, 對象基本上一創建就被釋放, 然而指針不為nil, 指針指向被釋放了的對象就報錯.

  • weak

    同樣不會增加引用計數, 跟assign不同, weak只能修飾OC對象類型, 并且是弱引用, 當對象被釋放的時候, 指針也會置為nil, 就不會出現野指針.一般用在修飾IBOutlet控件屬性 / delegate, 而block屬性對象在內部使用self或者其他強引用對象時候, 需要使用__weak弱引用

  • strong

    修飾對象類型, retain+1, 并且是在ARC環境下使用.

  • retain

    也是繼續是對象類型, 只能在MRC環境下使用

  • copy

    一般修飾不可變對象, NSString/NSArray/NSDictionary等, 還修飾 block屬性, 會將block對象從棧區復制一份到堆區, 避免過早釋放.

  • nonnull

    對象的值不允許空

  • nullable

    對象的值允許為空

  • null_unspecified

    不設定是否非空

實際里還有_Null_unspecified / _Nullable / _Nonnull, 意思跟對應的null_unspecified / nullable / nonnull是一樣的, 只是放的位置不一樣.

  • readwrite

    讀寫屬性, 默認就是讀寫屬性, 系統自動創建setter和getter方法.

  • readonly

    只讀屬性, 不允許改變屬性值, 系統只創建getter方法

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容