1. 程式人生 > >IOS中Retain和Copy的區別

IOS中Retain和Copy的區別

1 ,可讀性: readonly  、 readwrite
@property(readwrite,....) valueType value;
這個屬性是變數的預設屬性,就是如果你 (readwrite and readonly 都沒有使用,那麼你的變數就是 readwrite 屬性 ) ,通過加入 readwrite 屬性你的變數就會有 get 方法,和 set 方法。
property(readonly,...) valueType value;
這個屬性變數就是表明變數只有可讀方法,也就是說,你只能使用它的 get 方法。
2 , assign , setter 方法直接賦值,不進行任何 retain 操作,為了解決原型別與環循引用問題

3 , retain , setter 方法對引數進行 release 舊值再 retain 新值,所有實現都是這個順序
4 , copy , setter 方法進行 Copy 操作,與 retain 處理流程一樣,先舊值 release ,再 Copy 出新的物件, retainCount 為 1 。這是為了減少對上下文的依賴而引入的機制。
5 , nonatomic ,非原子性訪問,不加同步,多執行緒併發訪問會提高效能。
注意,如果不加此屬性,則預設是兩個訪問方法都為原子型事務訪問。鎖被加到所屬物件例項級 。 所以   不加 nonatomic 對與多執行緒是安全的   。
附網文:
Retain vs. Copy

copy  :   建立一個索引計數為 1 的物件,然後釋放舊物件
retain  :釋放舊的物件,將舊物件的值賦予輸入物件,再提高輸入物件的索引計數為 1
那上面的是什麼該死的意思呢?
Copy 其實是建立了一個相同的物件,而 retain 不是:
比如一個 NSString  物件,地址為 0×1111  ,內容為 @”STR”
Copy  到另外一個 NSString  之後,地址為 0×2222  ,內容相同,新的物件 retain 為 1  ,舊有物件沒有變化
retain  到另外一個 NSString  之後,地址相同(建立一個指標,指標拷貝),內容當然相同,這個物件的 retain 值 +1
也就是說, retain  是指標拷貝, copy  是內容拷貝。

注:NSString 類舉例是錯誤的。NSString沒有retain,定義時靜態分配一段記憶體。

相關推薦

IOSRetainCopy區別

1 ,可讀性: readonly  、 readwrite@property(readwrite,....) valueType value;這個屬性是變數的預設屬性,就是如果你 (readwrite and readonly 都沒有使用,那麼你的變數就是 readwrite 屬性 ) ,通過加入 read

iOS棧的區別

IE http sdn 改變 執行 需要 獨立 clas 類方法 https://blog.csdn.net/wallacewang_/article/details/72594977 類方法 當不需要訪問實例變量或者不改變實例狀態時,可寫成類方法。 Objec

IOS UIViewUIViewController的區別

宣告:這篇文章不是原創,因為覺得寫的好,才複製過來保留 ------------------------------------------------------------------------------ UIViewController顧名思義:檢視控制器。應該

ios類別擴充套件的區別

分類的小括號中必須有名字 @interface 類名(分類名字) /*方法宣告*/ @end @implementation類名(分類名字) /*方法實現*/ @end 分類只能擴充方法,不能擴充套件屬性和成員變數(如果包含成員變數會直接報錯)。如果分類中聲明瞭一個屬性,那麼分類只會生成這個屬性的set、

iOSassignweak的區別

一、區別 assign與weak,它們都是弱引用宣告型別,最大的區別在那呢? 如果用weak宣告的變數在棧中就會自動清空,賦值為nil。 如果用assign宣告的變數在棧中可能不會自動賦值為nil,就會造成野指標錯誤! 二、例項 他們常用在基本型別屬性,比如BO

Pythondeepcopy copy區別

歡迎使用Markdown編輯器寫部落格 最近在使用Python語言程式設計的過程中遇見了deepcopy()方法,想著這個名字比較特別,於是網上找了一下參考資料,索性比較了與copy()的區別。兩者區別如下: —–deepcopy(): 深複製,即將被

iOSassign、copyretain關鍵字的含義

assign: 簡單賦值,不更改索引計數 copy: 建立一個索引計數為1的物件,然後釋放舊物件 retain:釋放舊的物件,將舊物件的值賦予輸入物件,再提高輸入物件的索引計數為1 Copy其實是建立了一個相同的物件,而retain不是: 比如一個NSString物件,

iOS開發之關鍵字nonatomic、assign、retaincopy的認識

nonatomic、assign、retain和copy的認識 nonatomic 指非原子性訪問,不加同步,多執行緒併發訪問會提高效能。如果不加此屬性,則預設是兩個訪問方法都為原子型事務訪問。atomic是ObjectC中使用的一種執行緒保護技術,

iOSconst與static區別聯絡

const就是隻讀的意思,只在宣告中使用; static一般有2個作用,規定作用域和儲存方式.對於區域性變數,static規定其為靜態儲存方式,每次呼叫的初始值為上一次呼叫的值,呼叫結束後儲存空間不釋放; 對於全域性變數,如果以檔案劃分作用域的話,此變數只在當前檔案可見;對

mybatis的#$的區別

背景 插入 trac sql註入 -m .com article 參數 -s 1. #將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。如:order by #user_id#,如果傳入的值是111,那麽解析成sql時的值為order by "111", 如果傳

hibernatehql語句listiterate區別

每次 hibernate 寫入 所有 讀取 條件 iter 查詢 hql 1.使用list()方法獲取查詢結果,每次發出一條語句,獲取全部數據。2.使用iterate()方法獲取查詢結果,先發出一條SQL語句用來查詢滿足條件數據的id,然後依次按照這些id查詢記錄,也就是要

javaArrayListLinkedList區別

插入 list 新的 查找 arr tro 基於 列表 時間復雜度 ArrayList和LinkedList最主要的區別是基於不同數據結構 ArrayList是基於動態數組的數據結構,LinkedList基於鏈表的數據結構,針對這點,從時間復雜度和空間復雜度來看主要區別:

mysqlreplicate_wild_do_tablereplicate_do_db區別

lan rep cati mil 多人 pan think lte 避免 使用replicate_do_db和replicate_ignore_db時有一個隱患,跨庫更新時會出錯。 如在Master(主)服務器上設置 replicate_do_db=test(my.conf

linux ll ls 區別

彩色 顯示文件 時間排序 linux 常用 所有 數字 名稱 sub ll 列出來的結果詳細,有時間,是否可讀寫等信息 ,象windows裏的 詳細信息ls 只列出文件名或目錄名 就象windows裏的 列表ll -t 是降序, ll -t | tac 是升序 ll不是

jsdecodeURI()encodeURI()區別,decodeURIComponentencodeURIComponent區別

nbsp sch www 問題 encode 替換 副本 字符替換 序列 decodeURI()定義和用法:decodeURI()函數可對encodeURI()函數編碼過的URI進行解碼.語法:decodeURI(URIstring)參數描述:URIstring必需,一個字

HTP協議URIURL區別

int 名稱 net form 打開 文件路徑 指定 支持 地址 URL(uniform resource location ):統一資源定位符 URI(uniform resource identifier):統一資源標誌符 URI:可以表示一個域,也可以表示一個

mysqlvarcharchar區別(思維導圖整理)

var 但是 系統 mysql 由於 varchar .html nbsp 了解   由於mysql一直是我的弱項(其實各方面我都是很弱的),所以最近在看msyql,正好看到varchar和char區別,所以整理一下,便於以後遺忘。      0.0圖片已經說明一切,但是系

JavaScriptNullundefind區別

cdc 如何 undefine 只有一個 som pre cnblogs 定義 報錯 公眾號原文 Javascript有5種基本類型:Boolean,Number,Null,Undefined,String;和一種復雜類型:Object(對象); undef

淺談 Mybatis的 ${ } #{ }的區別

mybatis sql註入 語句 nbsp 之前 com pre 預編譯 sql 語句 一、舉例說明 1 select * from user where name = "dato"; 2 3 select * from user where name = #

mysql deletetrncate區別

重新 sql delet use 它的 刪除 掃描 進行 from mysql中刪除表記錄delete from和truncate table的用法區別: MySQL中有兩種刪除表中記錄的方法:(1)delete from語句,(2)truncate table語句。 d