歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 初識Swift中的值和引用,循壞引用、代理的注意點

初識Swift中的值和引用,循壞引用、代理的注意點

日期:2017/3/1 9:20:24   编辑:Linux編程

1.0 在Swift中分有值類型和引用類型

  Int 、String 、 結構體和枚舉都屬於值類型, 將值類型傳遞給方法是,將在內存中創建其副本,並傳遞這個副本;這樣我們就可以隨心所欲修改它,而不用擔心這會修改傳入的原始值。

  傳遞引用類型時不會復制它,而將其地址提供給可能使用他們的函數或方法。閉包以及從類實例化得到的對象都屬於引用類型。將閉包或者對象傳遞給方法時,不會創建其副本,而是傳遞引用(內存地址)。由於傳遞引用類型時不會創建其副本,因此需要特別小心,確保在正確的時間妥善地釋放它們,過早的釋放內存,將會導致崩潰,過晚又會導致內存洩露。

2.0 引用循環

  在這裡我們就用一個簡單地例子,來簡單的說明在開發中,怎麼樣會造成循環引用。

  例:一個人擁有一條狗,而狗擁有一個主人

  直接上代碼

這裡Person類裡面擁有一個dog屬性, 而deinit 相當OC中的dealloc函數

  這裡Dog類裡面有個主人。。。

在 main.swiftz中 我們這樣使用

運行程序,我們會看到,輸出台沒有任何輸出。。。。而當我們在它們其中一個類型中,在聲明屬性時 添加 weak 時,情況就會不一樣。。如,運行程序,就會打印出,人被回收,狗被回收。。。

   從這個例子我們看以看出 在使用 var 聲明時,默認是強引用,相當OC中的strong

   講到這裡 var 默認強引用,就想到代理

   一開始,我用Swift寫代理是這麼寫的

個人感覺,沒錯啊,可是在OC環境下變成了

這時感覺,跟蘋果的設計理念不同啊,一般代理屬性都應該是 weak啊,然後我就找到了 var delegate : LMTablBarViewDelegate? 這句,在前面添加weak 之後,在看看變化

這樣終於是自己想要的結果。。。。所有我們在設置 代理屬性時 應該 在前面 添加 weak修飾。

這些只是個人看法,如有錯誤,希望大家能幫忙修正

Swift 正式開源,同時開源 Swfit 核心庫和包管理器 http://www.linuxidc.com/Linux/2015-12/125847.htm

Apple Swift學習教程 http://www.linuxidc.com/Linux/2014-09/106420.htm

使用 Swift 構建一個 iOS 的郵件應用 http://www.linuxidc.com/Linux/2014-08/105542.htm

Swift 2.0開源化 http://www.linuxidc.com/Linux/2015-06/118594.htm

Linux下搭建Swift語言開發學習環境 http://www.linuxidc.com/Linux/2015-12/125983.htm

Swift 的詳細介紹:請點這裡

Copyright © Linux教程網 All Rights Reserved