Swift Substring

在swift中抗楔,當我們使用split方法的時候會返回一個Substring數(shù)組:
public func split(maxSplits: Int = default, omittingEmptySubsequences: Bool = default, whereSeparator isSeparator: (Character) throws -> Bool) rethrows -> [Substring]

這跟java或者ObjectC不同洼畅,在其他語言中我們將會得到一個String數(shù)組云石,為何swift返回一個新的類型Substring呢谤逼?

解釋這個問題之前珊皿,先來看另外一個問題:
如何提升split方法的效率擒权?

split方法就是根據(jù)特定字符串將原數(shù)組切分成不同的部分,我們知道String的存儲比較特殊适篙,一般都是在堆上,如果切分之后的子串也都存在堆上箫爷,無疑是一個巨大的開銷嚷节,況且方法調(diào)用者并不一定要用到每一個子串。

怎么辦呢虎锚?

那就共享內(nèi)存硫痰!

Substring
When you create a slice of a string, a Substring instance is the result. Operating on substrings is fast and efficient because a substring shares its storage with the original string. The Substring type presents the same interface as String, so you can avoid or defer any copying of the string’s contents.

split方法返回的每一個字符串子串不額外開辟內(nèi)存空間,而是使用原數(shù)組的地址窜护,這樣就可以省下分配空間的開銷效斑。這是內(nèi)部實現(xiàn),無論是使用Substring還是String都可以做到柱徙,那么回到最初的問題缓屠,Substring有啥優(yōu)勢?

答案就是护侮,這是一種優(yōu)秀的編程思想敌完!

考慮下面的case:

let bigContent : String = xxxx//獲取一大段文字
let partOfIt = splitContent(bigContent)//截取一小部分
summaryLabel.text = partOfIt//設(shè)置UILabel

根據(jù)上面的分析我們知道Substring和原字符串是共享內(nèi)存的,因此當上述邏輯執(zhí)行完畢之后羊初,只要summaryLabel沒有銷毀滨溉,bigContent所指向的字符串就不會釋放,即使我們只使用了該字符串的一部分长赞。

為避免上述內(nèi)存泄漏情況的出現(xiàn)晦攒,我們應(yīng)當給summaryLabel分配一個新的String

summaryLabel.text = String(partOfIt)

這樣bigContent該釋放就釋放,和summaryLabel不再相關(guān)得哆。

那為什么要用Substring脯颜?因為如果split返回的是[String],粗心的程序員很難會考慮到這么深入的問題柳恐,內(nèi)存泄漏很容易發(fā)生伐脖。因此在API設(shè)計的時候热幔,設(shè)置一個新的TypeSubstring,如果寫的是summaryLabel.text = partOfIt編譯器會報錯,提示類型轉(zhuǎn)化讼庇。

Important
Don’t store substrings longer than you need them to perform a specific operation. A substring holds a reference to the entire storage of the string it comes from, not just to the portion it presents, even when there is no other reference to the original string. Storing substrings may, therefore, prolong the lifetime of string data that is no longer otherwise accessible, which can appear to be memory leakage.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绎巨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蠕啄,更是在濱河造成了極大的恐慌场勤,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歼跟,死亡現(xiàn)場離奇詭異和媳,居然都是意外死亡,警方通過查閱死者的電腦和手機哈街,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門留瞳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人骚秦,你說我怎么就攤上這事她倘。” “怎么了作箍?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵硬梁,是天一觀的道長。 經(jīng)常有香客問我胞得,道長荧止,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任阶剑,我火速辦了婚禮跃巡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘个扰。我一直安慰自己瓷炮,他們只是感情好葱色,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布递宅。 她就那樣靜靜地躺著,像睡著了一般苍狰。 火紅的嫁衣襯著肌膚如雪办龄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天淋昭,我揣著相機與錄音俐填,去河邊找鬼。 笑死翔忽,一個胖子當著我的面吹牛英融,可吹牛的內(nèi)容都是我干的盏檐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼驶悟,長吁一口氣:“原來是場噩夢啊……” “哼胡野!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起痕鳍,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤硫豆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后笼呆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熊响,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年诗赌,在試婚紗的時候發(fā)現(xiàn)自己被綠了汗茄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡铭若,死狀恐怖剔难,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奥喻,我是刑警寧澤偶宫,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站环鲤,受9級特大地震影響纯趋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冷离,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一吵冒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧西剥,春花似錦痹栖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咆畏,卻和暖如春南捂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旧找。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工溺健, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钮蛛。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓鞭缭,卻偏偏與公主長得像剖膳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子岭辣,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗潮秘。 張土汪:刷leetcod...
    土汪閱讀 12,743評論 0 33
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)易结,斷路器枕荞,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法搞动,內(nèi)部類的語法躏精,繼承相關(guān)的語法,異常的語法鹦肿,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • 首頁 資訊 文章 資源 小組 相親 登錄 注冊 首頁 最新文章 IT 職場 前端 后端 移動端 數(shù)據(jù)庫 運維 其他...
    Helen_Cat閱讀 3,869評論 1 10
  • 1.秦至晚清都不是封建制 封建矗烛,把土地冊封給諸侯,讓這些被冊封的人去建立國家箩溃。而秦之后的王朝實行的都是中央集權(quán)制瞭吃。...
    獨孤無塵閱讀 1,015評論 0 0