swift学习笔记-----swift中的指针
? ? ? ? swift語言為了簡化,把指針隱形化了。沒有像OC中那樣的“ * ”。把底層的問題交給C語言去處理,我們可以在swift中調用C 語言來解決。當然,OC也是可以調用的。
? ? ? ? 但是在某些場景下,這種調用可能不是很方便。比如,基于字節流的解析中,這時我們所接受的數據是要進行解析,可能用到指針。如果在C中去調用,當然也是可以的。但如果想寫的簡潔一些,用swift直接去處理這些,是否可以呢。那就要看在swift中是否很好的去使用指針呢。
? ? ? ?事實上,swift是支持使用指針的。蘋果已經公開了swift的源碼,這個大家都可以去看。源碼是用C++寫的。不過既然是一種新型的語言,又要避免OC走過的老路。所以肯定不能直接像在OC中那樣直接使用指針了。在Swift 中指針被映射為了一個泛型類型,并且還比較抽象。這在一定程度上造成了在 Swift 中指針使用的困難。雖然如此,還是可以使用的,那么這就是使得字節流解析,在swift中變成了可能。
? ? ?一、指針的定義
????????在swift中,我們如何定義指針呢。比如:
???let??tmpInt???=??20;let??ptr??????=??&tmpInt;???這樣的話編譯不通過。所以不能這么使用。比如在C語言里,分配內存空間,然后賦值,可以寫成這樣。先申請內存空間int?*?ptr?=?(int*)malloc(sizeof(int)*1);根據地址將數據寫入申請到的內存空間*ptr?=?10;這個我們用swift來寫,寫成下面的形式。var?intPtr?=?UnsafeMutablePointer<Int>.alloc(1);print("intPtr?=?\(intPtr)");打印可以得到分配到空間的地址,一般來講是4個字節的首地址。由此,我們可以看到,在swift中,主要使用UnsafeMutablePointer的幾種形式,來進行指針方面的操作通過指針來給相應的內存空間賦值,在swift中如何去做呢?如同C的寫法,直接訪問內存空間intPtr.memory?=?20;print("用C的方式賦值以后的值是?\(intPtr.memory)");通過打印,可以看到內存空間的值確實被改變了。除了用這種方式以外,還可以用另外的一種方式,先分配空間,然后再進行初始化var?intPtr?=?UnsafeMutablePointer<Int>.alloc(1);intPtr.initialize(10);print("intPtr?=?\(intPtr)");print("intPtr?value?=\(intPtr.memory)");通過如上的代碼,可以看到如同C一樣可以使用。二、內存的釋放在C語言和C++中,我們申請堆空間的原則是“誰申請,誰釋放”。在OC中,早期也是采用MRC的機制,后來才使用ARC的機制。那么在swift中,我們申請的內存空間,需不需釋放呢?答案是顯然需要釋放。如同C的寫法一樣,我們先來看一下在C語言中的完整的寫法。//申請內存空間,4個字節int?*?ptr?=?(int*)malloc(sizeof(int)*1);//通過指針,賦值*ptr?=?30;???使用完成,釋放空間????//釋放ptr所指向的內存空間free(ptr);//將指針變量的值設置為空ptr?=?NULL;那么在swift中如何釋放內存呢?我們來看完整的過程。//1.申請4字節的內存空間var?intPtr?=?UnsafeMutablePointer<Int>.alloc(1);//2.初始化內存空間的值,或者直接給內存空間賦值intPtr.initialize(10);//使用完成以后,釋放內存空間intPtr.destroy();??//1.用來銷毀對象intPtr.dealloc(1);?//2.釋放指針所指向的內存空間intPtr??=?nil;?????//3.指針設為空指針? ? ? ? ? ?由此可以看出,swift的內存釋放過程比C語言的要復雜一些。
?三、在函數中的傳參中使用
? ? ? ? ? ?1.C語言在函數傳參中使用指針。這個我們先看C語言的一個小例子。如: ? ? ? ? ??
????//定義一個int類型的變量a,并給a賦值int?a?=?10;//定義一個函數,并通過該函數來修改變量a的值。void?changeData(int?*?tmpA,int?value){*tmpA?=?value;}//我們來調用該函數來修改變量a的值changeData(&a,100);//打印a的值printf("a?=?%d\n",a);2.swift中使用var?tmp?=?20;//在swfit中定義該函數func?incrementor(ptr:UnsafeMutablePointer<Int>){ptr.memory?+=?10;}//調用該函數incrementor(&tmp);print("tmp?=?\(tmp)");在swift中,還可以通過inout這關鍵字,在函數中使用//定義函數,使用關鍵字inoutfunc?testPointUse(inout?num:Int){num?+=?1}//調用該函數,注意,這個地方的參數要傳時加上取地址符號。testPointUse(&tmp);print("tmp?=?\(tmp)");??四、指向數組的指針在swift中,如何用指針指向數組呢?//定義一個swift的數組var?array?=?[1,2,3,4,5];//定義一個指向該數組的指針,參數是數組的地址和數組的countvar?arrayPtr?=?UnsafeMutableBufferPointer<Int>(start:?&array,?count:?array.count)var?basePtr?=?arrayPtr.baseAddress?as?UnsafeMutablePointer<Int>;print("basePtr.memory?=?\(basePtr.memory)");print("basePtr?=?\(basePtr)");basePtr.memory?=?10;print("basePtr.memory?=?\(basePtr.memory)");print("basePtr?=?\(basePtr)");var?nextPtr?=?basePtr.successor();print("nextPtr.memory?=?\(nextPtr.memory)");? ? ? ? ?swift的指針使用較少,但在目前智能家電app的開發中,如果使用swift而不是OC的話,或者你的代碼要從oc遷移到swift的話,那么這種指針方法的函數一定不少。當然在OC中,你是可以直接使用C的。這個沒有問題。但你的項目遷移到swift以后,這些函數你就要在C中實現,然后用swift去調用,這樣做當然沒有錯。就是有時這種調用感覺不爽,那你也可以用swift去試試。看能否把那些用C寫的函數用swift改寫了。這樣,我們的項目中,對于新人來說,特別是那些C語言功底很薄弱的開發人員來說,不用每次去看C函數。修改也變得直接了。
? ? ? ? 當然這只是我一家之言,大家對文中有不對的地方,如有時間,可以多交流。
轉載于:https://blog.51cto.com/liuyufeng/1747464
總結
以上是生活随笔為你收集整理的swift学习笔记-----swift中的指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用Guava的Suppliers.me
- 下一篇: 安卓事件机制与页面跳转