你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> IOS中(assign,retain,copy,weak,strong)的區別以及nonatomic的含義

IOS中(assign,retain,copy,weak,strong)的區別以及nonatomic的含義

編輯:IOS開發綜合

IOS中(assign,retain,copy,weak,strong)的區別以及nonatomic的含義

我們在聲明@property 屬性時,總是要在括號中寫上assign、retain、copy、weak、strong中的一個,很多時候,我們僅僅只是按照習慣去寫經常寫的那一個,但有時候看代碼時又會發現別人用的不盡相同,那這些之間的區別是什麼呢?

首先,上面五個並不是在一個層面上的,可以分為兩部分,第一部分是assign、retain、copy,第二部分是weak、strong。

我們先說第一部分的assign、retain、copy。

assign:

assign一般用來修飾基本的數據類型,包括基礎數據類型 (NSInteger,CGFloat)和C數據類型(int, float, double, char, 等等),為什麼呢?assign聲明的屬性是不會增加引用計數的,也就是說聲明的屬性釋放後,就沒有了,即使其他對象用到了它,也無法留住它,只會crash。但是,即使被釋放,指針卻還在,成為了野指針,如果新的對象被分配到了這個內存地址上,又會crash,所以一般只用來聲明基本的數據類型,因為它們會被分配到棧上,而棧會由系統自動處理,不會造成野指針。

retain:

與assign相對,我們要解決對象被其他對象引用後釋放造成的問題,就要用retain來聲明。retain聲明後的對象會更改引用計數,那麼每次被引用,引用計數都會+1,釋放後就會-1,即使這個對象本身釋放了,只要還有對象在引用它,就會持有,不會造成什麼問題,只有當引用計數為0時,就被dealloc析構函數回收內存了。

copy:

最常見到copy聲明的應該是NSString。copy與retain的區別在於retain的引用是拷貝指針地址,而copy是拷貝對象本身,也就是說retain是淺復制,copy是深復制,如果是淺復制,當修改對象值時,都會被修改,而深復制不會。之所以在NSString這類有可變類型的對象上使用,是因為它們有可能和對應的可變類型如NSMutableString之間進行賦值操作,為了防止內容被改變,使用copy去深復制一份。copy工作由copy方法執行,此屬性只對那些實現了NSCopying協議的對象類型有效 。

以上三個可以在MRC中使用,但是weak和strong就只能在ARC中使用,也就是自動引用計數,這時就不能手動去進行retain、release等操作了,ARC會幫我們完成這些工作。

weak:

weak其實類似於assign,叫弱引用,也是不增加引用計數。一般只有在防止循環引用時使用,比如父類引用了子類,子類又去引用父類。IBOutlet、Delegate一般用的就是weak,這是因為它們會在類外部被調用,防止循環引用。

strong:

相對的,strong就類似與retain了,叫強引用,會增加引用計數,類內部使用的屬性一般都是strong修飾的,現在ARC已經基本替代了MRC,所以我們最常見的就是strong了。

nonatomic:

在修飾屬性時,我們往往還會加一個nonatomic,這又是什麼呢?它的名字叫非原子訪問。對應的有atomic,是原子性的訪問。我們知道,在使用多線程時為了避免在寫操作時同時進行寫導致問題,經常會對要寫的對象進行加鎖,也就是同一時刻只允許一個線程去操作它。如果一個屬性是由atomic修飾的,那麼系統就會進行線程保護,防止多個寫操作同時進行。這有好處,但也有壞處,那就是消耗系統資源,所以對於iPhone這種小型設備,如果不是進行多線程的寫操作,就可以使用nonatomic,取消線程保護,提高性能。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

[db:作者簡介][db:原文翻譯及解析]

【IOS中(assign,retain,copy,weak,strong)的區別以及nonatomic的含義】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved