2015-12-19 11 views

回答

2

iOS Developer Library

夫特String類型和NSString類之間自動橋接。

從夫特源 - >stdlib/public/core/String.swift

String橋接到目標C作爲NSStringString 起源在Objective-C可在其字符存儲在 NSString。由於NSString的任意子類可以變爲String,所以在這種情況下不存在關於表示或效率的保證。由於NSString是不可變的,它是 就好像該存儲被一些拷貝共享:第一是 突變操作的任何序列引起元件被複制 成唯一的,連續的存儲這可能花費O(N)時間和 空間,其中N是字符串表示的長度(或者 以上,如果基礎NSString具有不尋常的性能 特性)。

這些是我從該段得出的結論。注意:NSString是不可變的,我不確定NSMutableString是如何工作的,這取決於你的具體情況。

  1. 橋接NSStringString本質上是一個自由操作;沒有轉換是必要的。 O(1)
    • NSString使用UTF-16作爲其後備存儲。 String使用UTF-16或ASCII,因此這兩個實例可以使用相同的內存。
  2. 但是,如果您然後變異String結構,所有的內存將需要從原始NSString複製。 O(N)
    • String無法修改後備存儲器,也不修改NSString的存儲器。這就是爲什麼內存必須被複制的原因,因此String擁有自己的內存。用於背襯StringCore即迅速用途

的源代碼。

+0

雖然字符串的數據不被複制,但結構是否被複制?字符串對象通常分兩部分實現,一個是動態分配的數組,另一個是指向數組並封裝的結構/類。我明白前者不會被複制。後者是? –

+2

String結構本身被複製爲yes。它目前大小爲3個字,所以不是一個昂貴的副本:1個字開始,1個字長,1個字緩衝區所有者。我認爲(但已經驗證),memcpy指令之上的唯一開銷是與緩衝區所有者有關的任何引用計數。 – Kevin

+2

一個16字節的memcpy(與我們在這裏的12個雖然它們可能是相同的速度)需要0.7納秒,ObjectVie-C保留/釋放需要23.3納秒。你的里程可能會有所不同,但tldr是「不可思議的快速」。資料來源:https://www.mikeash.com/pyblog/friday-qa-2016-04-15-performance-comparisons-of-common-operations-2016-edition.html – Kevin