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 的詳細介紹:請點這裡