SlideShare a Scribd company logo
1 of 20
拷貝 - NSCopying
Marvin Lin @Swift Taipei
9th Jan. 2019
使用 Swift 和 Obj-C 操作 Array 的複製行為
Swift:
anotherArra
y 的行為不會
改變 array
Obj-C:
anotherArra
y 的行為改變
了 array
其他語言是怎麼選邊站的
http://tpcg.io/wqsJiV
Python
http://tpcg.io/Fyyvdr
Java
https://rextester.com/KJHC69608
Kotlin
一個精典的老笑話: 當你在高速公路上發現大家都逆向行駛的時候,
你要確定是不是只有你在逆向行駛
原型模式 - Prototype pattern
情境
• 某個遊戲的某關,Boss 是忍者
• 這個遊戲對 boss 有各種 nerf 狀
態。中毒、減傷、破甲、緩速、
拌筋,共30種 nerf 狀態,buff
有另外10種狀態。
• 打到 1/2 血的時候, boss 會使
用絕招 -「影分身」
• 影分身會複製出 4 個和 boss 狀
態一模一樣的分身,血量和 nerf
狀態會同時複製。
• 影分身受傷的時候,本體不會有
影響,但本體 hp 歸 0 的時候,
才進行寶物結算。
當你寫了 let aObject = SomeClass() 時,到底發生了什麼事
• 1. 在 runtime 時, Swift 會去找符合 SomeClass 名字的
Template。
• 2. Swift 進行記憶體配置,把物件儲存後,接著進行 init()。
• 3. 把產生的 Object 回傳給呼叫者.
原型模式
• 他怎麼運作?
• 這模式帶來的好處?
• 什麼時候使用這個模式?
• 什麼時候該避免使用?
• 有隱藏的風險嗎?
• 相關的模式
• 泛用性
• 使用 Copy 的方式,直接複製已經存在的物件。
• 使用這個物件時,並不需要知道 init 的條件。
• 如果你想避免 init 的條件和當下物件產生依賴時
• 這個模式並沒有特定缺點,但你應該依照需求來決定最
適合的設計模式。
• 要注意 shallow copy 和 deep copy (後述)
• 1> Template patter, 2> Singleton Pattern
• 泛用性並不高,因為 Copy 只有在特定場合比較好用
原型模式的運作方式
• 1. 先找出對應的原型(Prototype),然後 request copy()
• 2. Prototype 進行 copy 後,生出被複製的物件(Clone)
• 3. 把產生的 Clone Object 回傳給呼叫者.
範例 - 用 struct 來生出 clone object
但如果你用 class 來生出 clone object……
Class 是 ref type 會指向同一個記憶體位址
因為 class 是 ref object,所以要宣告成 NSObject 且
confirm NSCopying protocol
但如果你 class 裡面有個 property 是 class 呢?
Appointment 的 NSCopying Protocol 會不會
對 Location 產生作用?
空間不夠,但是 Appointment 有寫 extension 去 confirm NSCopying
brary/archive/documentation/Cocoa/Conceptual/Collections/Articles/Copying.html#//apple
Place 這個 object 怎樣被指向
會議路888號
如果要做 deep copy,那就要連
Location 也要 confirm
NSCopying Protocol
如何決定 Shallow Copy 或 Deep Copy?
• 1. 物件是怎麼被使用的?
• 2. Copy 所需要的記憶體和成本
• 3. 寫 Copy 所需要的工
實例
用 Prototype pattern 進行
Messege Logger 的實作,
以及客戶追加需求的例子
。
• 何時選擇 Value type? 何時選擇 Reference type?
- 當你使用的 Framework 裡面有很多繼承自 NSObject 的物件,那
你就必須使用 class.
• 使用 Value Type 的時機
- 當你在比較兩個實例使用 “==” 比較合理的時候
- 你希望被拷貝的物件和原始物件互相獨立
- 當你的資料會被用在多執行緒 (multiple threads) 的時候
• 使用 Reference Type 的時機
- 比較兩個實例時使用 “===” 比較合理的時候
- 你的物件希望能被共用,或有可能有不同狀態
• 在 Swift 裡面, Array, String, Dictionary 是 Value Types。他們的
操作就如同 int value 在 C 語言一樣。這個特定讓你在拷貝資料在不
同 threads 的時候,不用特別處理同步的問題。(原文如下)
(you can safely pass copies of values across threads without synchronization. In
the spirit of improving safety, this model will help you write more predictable
code in Swift.)
https://developer.apple.com/swift/blog/?id=10
試試看這個
• 已知在 Swift 裡面, Array 是 value type.
• 如果我在裡面塞 class。
• 從這個 Array 再複製出另一個 Array ( let arrayB = arrayA)
• 問題: 改變後來出現的 Array 裡面的 class 的 property ,第
一個 Array 裡面的 class property 會不會變?

More Related Content

Similar to NSCopying between Objective-C and Swift

Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJustin Lin
 
Oh K8s Is Swag - Kubernetes Basics
Oh K8s Is Swag - Kubernetes BasicsOh K8s Is Swag - Kubernetes Basics
Oh K8s Is Swag - Kubernetes BasicsOkis Chuang
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUGYingSiang Geng
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7Justin Lin
 
Introduction to Nand Flash interface (chinese)
Introduction to Nand Flash interface (chinese)Introduction to Nand Flash interface (chinese)
Introduction to Nand Flash interface (chinese)Sneeker Yeh
 
[若渴計畫]64-bit Linux Return-Oriented Programming
[若渴計畫]64-bit Linux Return-Oriented Programming[若渴計畫]64-bit Linux Return-Oriented Programming
[若渴計畫]64-bit Linux Return-Oriented ProgrammingAj MaChInE
 
Javascript primer plus
Javascript primer plusJavascript primer plus
Javascript primer plusDongxu Yao
 
MySQL自动切换设计与实现
MySQL自动切换设计与实现MySQL自动切换设计与实现
MySQL自动切换设计与实现orczhou
 
主库自动切换 V2.0
主库自动切换 V2.0主库自动切换 V2.0
主库自动切换 V2.0jinqing zhu
 
為什麼 App 卡卡的
為什麼 App 卡卡的為什麼 App 卡卡的
為什麼 App 卡卡的鈺翔 林
 
JVM上的实用Lisp方言:Clojure
JVM上的实用Lisp方言:ClojureJVM上的实用Lisp方言:Clojure
JVM上的实用Lisp方言:ClojureRui Peng
 
105-2 iOS程式設計(二)
105-2 iOS程式設計(二) 105-2 iOS程式設計(二)
105-2 iOS程式設計(二) Hao Lee
 
介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用Jerry Lin
 
網路技術心得分享
網路技術心得分享網路技術心得分享
網路技術心得分享Mux Baxer
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swttka
 
分布式索引系统调研
分布式索引系统调研分布式索引系统调研
分布式索引系统调研zijingyeshao
 
COSCUP 2016 - LLVM 由淺入淺
COSCUP 2016 - LLVM 由淺入淺COSCUP 2016 - LLVM 由淺入淺
COSCUP 2016 - LLVM 由淺入淺宗凡 楊
 
COSCUP2016 - LLVM框架、由淺入淺
COSCUP2016 - LLVM框架、由淺入淺COSCUP2016 - LLVM框架、由淺入淺
COSCUP2016 - LLVM框架、由淺入淺hydai
 

Similar to NSCopying between Objective-C and Swift (20)

Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
 
Oh K8s Is Swag - Kubernetes Basics
Oh K8s Is Swag - Kubernetes BasicsOh K8s Is Swag - Kubernetes Basics
Oh K8s Is Swag - Kubernetes Basics
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
 
Something about Kafka - Why Kafka is so fast
Something about Kafka - Why Kafka is so fastSomething about Kafka - Why Kafka is so fast
Something about Kafka - Why Kafka is so fast
 
Introduction to Nand Flash interface (chinese)
Introduction to Nand Flash interface (chinese)Introduction to Nand Flash interface (chinese)
Introduction to Nand Flash interface (chinese)
 
[若渴計畫]64-bit Linux Return-Oriented Programming
[若渴計畫]64-bit Linux Return-Oriented Programming[若渴計畫]64-bit Linux Return-Oriented Programming
[若渴計畫]64-bit Linux Return-Oriented Programming
 
Javascript primer plus
Javascript primer plusJavascript primer plus
Javascript primer plus
 
MySQL自动切换设计与实现
MySQL自动切换设计与实现MySQL自动切换设计与实现
MySQL自动切换设计与实现
 
主库自动切换 V2.0
主库自动切换 V2.0主库自动切换 V2.0
主库自动切换 V2.0
 
為什麼 App 卡卡的
為什麼 App 卡卡的為什麼 App 卡卡的
為什麼 App 卡卡的
 
JVM上的实用Lisp方言:Clojure
JVM上的实用Lisp方言:ClojureJVM上的实用Lisp方言:Clojure
JVM上的实用Lisp方言:Clojure
 
105-2 iOS程式設計(二)
105-2 iOS程式設計(二) 105-2 iOS程式設計(二)
105-2 iOS程式設計(二)
 
介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用
 
網路技術心得分享
網路技術心得分享網路技術心得分享
網路技術心得分享
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt
 
貪食蛇
貪食蛇貪食蛇
貪食蛇
 
分布式索引系统调研
分布式索引系统调研分布式索引系统调研
分布式索引系统调研
 
COSCUP 2016 - LLVM 由淺入淺
COSCUP 2016 - LLVM 由淺入淺COSCUP 2016 - LLVM 由淺入淺
COSCUP 2016 - LLVM 由淺入淺
 
COSCUP2016 - LLVM框架、由淺入淺
COSCUP2016 - LLVM框架、由淺入淺COSCUP2016 - LLVM框架、由淺入淺
COSCUP2016 - LLVM框架、由淺入淺
 

NSCopying between Objective-C and Swift

Editor's Notes

  1. 如果你已經理解了,當然不用我講。 如果你還沒理解,我講了你也沒有真正理解。 動手寫吧