1. 程式人生 > >iOS 深入瞭解自定義物件 深拷貝,多層次深拷貝

iOS 深入瞭解自定義物件 深拷貝,多層次深拷貝

關於iOS的深拷貝,淺拷貝已經有很多文章,不必在過多贅述。有關係統常見可變物件和不可變物件的

copy 和 mutableCopy網上有很多文章,一張圖基本上可以說明


那麼本文著重要研究的是自定義物件的拷貝問題,特別比如說自定義物件裡面有屬性可以

一、物件持有另一個本類的例項物件,這樣形成多層次的持有關係時。

例如有類如下


其中的bestFriend屬性可以持有本類的例項物件,該物件的此屬性也有可能持有另一個例項物件。下面研究其拷貝實現。

首先自定義類要使用copy函式需要實現<NSCopying>協議,裡面只有一個函式

copyWithZone:,此處NSZone引數不用管這是以前iOS物件儲存分了很多區,現在都只有一個defaultZone.

例子程式碼如下:


關於自定義物件的拷貝結果不同主要由copyWithZone:方法的實現決定.

1.函式裡直接賦值


實現結果為方便觀察直接在lldb除錯區檢視,本篇文章demo也由執行時實現了description函式

列印物件裡面各屬性,有興趣的可以瞭解一下。


可以看出拷貝的物件是在不同地址,但是物件裡面的物件屬性和字串屬性是相同的且指向同樣的記憶體。

2.將字串拷貝,物件屬性也拷貝


此種實現結果為:


可以看出拷貝物件的地址不同,裡面的物件屬性 和物件屬性裡面的每一層物件屬性地址也不同,

另外對字串實現了可變拷貝之後又生成不可變字串,字串指向的地址也都進行了深拷貝。

一、物件持有一個容器,容器裡面是本類的例項物件,這樣形成多層次的持有關係時。


例如有類如下:


例子程式碼:


此處要介紹一個方法

使用此方法建立的陣列,陣列中的每一個物件都會受到一則copyWithZone:的訊息去拷貝一個物件。

- initWithArray:copyItems:

其實現結果為:


結果於上面例子相同,拷貝出來的物件地址不同,裡面的各屬性地址不同,每一層容器屬性裡面的物件也不同。

另外,關於陣列的深拷貝函式有一個猜想,因為其方法對給數組裡面的每個物件傳送copyWithZone訊息,(其實就是呼叫它本身的copy方法),則我們可以驗證一下這個copy是否滿足文章開頭對各個物件copy的調查結果。

於是我們把例子程式碼作一下修改並另外又寫了一個例子


有興趣的可以下載我的原始碼檢視,結論是該方法會對數組裡面的每個物件傳送copyWithZone:方法,如果在下層物件的copyWithZone中又有呼叫此方法,就會再向下一層物件傳送copyWithZone方法。


***以上  專案名稱T_yunCopyDemo



(歡迎隨手給一顆星星哦~)本篇部落格Demo地址https://github.com/xmy0010/DemoForCSDN

本人郵箱[email protected]歡迎小夥伴一起討論,學習,進步。


相關推薦

iOS 深入瞭解定義物件 拷貝層次拷貝

關於iOS的深拷貝,淺拷貝已經有很多文章,不必在過多贅述。有關係統常見可變物件和不可變物件的copy 和 mutableCopy網上有很多文章,一張圖基本上可以說明那麼本文著重要研究的是自定義物件的拷貝問題,特別比如說自定義物件裡面有屬性可以一、物件持有另一個本類的例項物件,

Java 判斷定義物件是否相等需要覆寫equals()方法

public class Test { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { th

iOS開發之定義鍵盤(數字字母型別等隨意切換)

專案開發很多時候用系統給的鍵盤不是很滿足自身實際需求,那就自定義一個吧: 方法其實很簡單,重新定義一個view,繼承UItextfield,把UI設計好的需求鍵盤加入新的otherKeyboardView,然後執行程式碼:  self.inputView =self.oth

mybaits xml實現繼承關係dto定義物件關聯查詢(一對)

服務結構:自定義dto類:場景:dto類繼承OccInfo類,並且OccAttr為子類,集合型別。package com.example.demo.domain; import lombok.Data; import java.io.Serializable; import

iOS 之JSON序列化的注意(陣列字典定義物件的序列化)

注意:要序列化的物件:最外層的物件型別必須是NSArray或NSDictionary;字典的key必須是NSSting型別;數字不能是NAN或無限大;所有的物件型別必須時NString,NSNumber,NSAray,NSDIctionary,NSNull;- (void)v

ios定義物件(或定義資料型別)歸檔

*  歸檔是一種很常用的檔案儲存方法,幾乎任何型別的物件都能夠被歸檔儲存(實際上是一種檔案儲存的形式),步驟如下  1、物件要遵守NSCoding協議  2、實現以下兩個方法: 解檔方法:         -(id)initWithCoder:(NSCoder

iOS 定義物件陣列排序 定義物件某屬性排序

文章翻譯自stackoverflow問題‘How to sort an NSMutableArray with custom objects in it?’ 以下是正文: 陣列排序我們經常用到,有時

定義物件作為HashMap的Key

這個問題在很多面試者面試時都會被提及,本人也是最近在看effective java第九條:覆蓋equals時總要覆蓋hashcode回想到了當初面試時也被問到了這個問題.於是動手寫了幾行程式碼,還真發現了一些小的問題,所以拿出來分享一下! 首先我們自定義一個學生物件,它有姓名和年齡兩個欄位.

30-集合--Map+keySet()/entrySet()獲取元素+Map.Entry+Map子類的特點+Hashtable+Properties+HashMap/TreeMap儲存定義物件

一、Map 1、Map與Collection都是集合框架中的頂層介面。Map集合一次新增一對元素,也稱為雙列集合(Collection集合一次新增一個元素,也稱為單列集合) 2、interface Map<K, V>:將鍵對映到值的物件。一個對映不能包含重複的鍵,每個鍵最多隻能對

27-集合--Set及其子類(HashSet+LinkedHashSet+TreeSet)+二叉樹+Comparable+Comparator+雜湊表+HashSet儲存定義物件+判斷元素唯一的方式

一、Set 1、Set:元素不可以重複,是無序的(存入和取出的順序不一致) 2、Set介面中的方法和Collection中的方法一致 3、Set集合的元素取出方式只有一種:迭代器iterator() Set set = new HashSet(); I

定義物件重寫hashCode和equals

自定義物件重寫hashCode和equals /* * HashSet集合的自身特點: * 底層資料結構,雜湊表 * 儲存,取出都比較快 * 執行緒不安全,執行速度快 */

雜湊表的儲存定義物件

雜湊表的儲存自定義物件 /* * HashSet集合的自身特點: * 底層資料結構,雜湊表 * 儲存,取出都比較快 * 執行緒不安全,執行速度快 */ public class HashSetDemo1

定義物件的mysql輸出

1、首先,自定義物件,該物件需要實現序列化功能才可以在網路上執行,實現序列化功能需要繼承 java.io.Serializable 這個介面, 這個介面定義了空方法,不需要實現任何功能,表示具有序列化功能的一個空介面 不過需要定義一個序列號,例如如下:  private static fi

Map集合的遍歷方式以及TreeMap集合儲存定義物件實現比較的Comparable和Comparator兩種方式

Map集合的特點 1、Map集合中儲存的都是鍵值對,鍵和值是一一對應的 2、一個對映不能包含重複的值 3、每個鍵最多隻能對映到一個值上   Map介面和Collection介面的不同 Map是雙列集合的根介面,Collection是單列集合的根介面 1、Map是雙列的(是雙列集合的根介

定義物件和json互轉

       有一次寫side project時,用json.dumps()方法對UserInfo物件進行序列化,卻報錯了。Object type of UserInfo is not JSON serializable.經過一番探索發現,json.dum

iOS開發學習-定義控制元件賦值問題--在model的set方法中給控制元件賦值

在自定義控制元件的過程中,剛開始的時候碰到問題是如何給各控制元件動態賦值,最初的想法是把各控制元件屬性放在.h檔案中定義.然後在控制器內獲取資料一一賦值(可行),但是這樣就增加了控制器中的程式碼,比如給定一個場景: collectionViewCell中,有10個控制元件,需要顯示10個數據,這

Xcode開發ios專案遇到定義執行時屬性異常

異常包含以下字樣: this class is not key value coding-compliant for the key 原因: 添加了使用者定義的執行時屬性,去檢查一下, 點選報錯對應的控制元件,然後看一下,不需要的刪除,如果是空名稱的更要刪除,例如下圖:

iOS開發 tabbar定義轉場動畫

1.小記 關於自定義轉場動畫,只要你理清他的”套路”,你就可以隨心所欲地自定義了. 大體思路就是:遵守對應的代理協議,然後設定對應的代理,實現代理方法,這個代理方法要返回的值就是你要實現的動畫.(如果返回nil,就是預設效果) 以UITabBarController為例的

Java 知識點整理-10.Java集合框架 去除ArrayList中重複字串、定義物件 棧和佇列 泛型 JDK5新特性 asList() toArray(T[] a) ArrayList迴圈巢狀

詳細標題:去除ArrayList中重複字串、自定義物件元素方式 棧和佇列 泛型 JDK5新特性(增強for迴圈 三種迭代(普通for、迭代器、增強for)中的元素能否刪除 靜態匯入 可變引數)Arrays工具類的asList() Collection中toArray(T[] a) 集合巢狀之Arra

JavaScript實現建立定義物件的常用方式總結

物件字面量方式 物件字面量方式是建立自定義物件的首選模式,簡單方便。 var per = { name:'zhangsan', age:25, job:'html', sayName:function(){ alert(this.name); } } *