swift語言為了簡化,把指標**化了。沒有像oc中那樣的「 * 」。把底層的問題交給c語言去處理,我們可以在swift中呼叫c 語言來解決。當然,oc也是可以呼叫的。
但是在某些場景下,這種呼叫可能不是很方便。比如,基於位元組流的解析中,這時我們所接受的資料是要進行解析,可能用到指標。如果在c中去呼叫,當然也是可以的。但如果想寫的簡潔一些,用swift直接去處理這些,是否可以呢。那就要看在swift中是否很好的去使用指標呢。
事實上,swift是支援使用指標的。蘋果已經公開了swift的原始碼,這個大家都可以去看。原始碼是用c++寫的。不過既然是一種新型的語言,又要避免oc走過的老路。所以肯定不能直接像在oc中那樣直接使用指標了。在swift 中指標被對映為了乙個泛型型別,並且還比較抽象。這在一定程度上造成了在 swift 中指標使用的困難。雖然如此,還是可以使用的,那麼這就是使得位元組流解析,在swift中變成了可能。
一、指標的定義
在swift中,我們如何定義指標呢。比如:
lettmpint=20;
letptr=&tmpint;這樣的話編譯不通過。所以不能這麼使用。
比如在c語言裡,分配記憶體空間,然後賦值,可以寫成這樣。
先申請記憶體空間
int*ptr=(int*)malloc(sizeof(int)*1);
根據位址將資料寫入申請到的記憶體空間
*ptr=10;
這個我們用swift來寫,寫成下面的形式。
varintptr=unsafemutablepointer.alloc(1);
print("intptr=/(intptr)");
列印可以得到分配到空間的位址,一般來講是4個位元組的首位址。
由此,我們可以看到,在swift中,主要使用unsafemutablepointer的幾種形式,來
進行指標方面的操作
通過指標來給相應的記憶體空間賦值,在swift中如何去做呢?
如同c的寫法,直接訪問記憶體空間
intptr.memory=20;
print("用c的方式賦值以後的值是/(intptr.memory)");
通過列印,可以看到記憶體空間的值確實被改變了。
除了用這種方式以外,還可以用另外的一種方式,先分配空間,然後再進行初始化
varintptr=unsafemutablepointer.alloc(1);
intptr.initialize(10);
print("intptr=/(intptr)");
print("intptrvalue=/(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位元組的記憶體空間
varintptr=unsafemutablepointer.alloc(1);
//2.初始化記憶體空間的值,或者直接給記憶體空間賦值
intptr.initialize(10);
//使用完成以後,釋放記憶體空間
intptr.destroy();//1.用來銷毀物件
intptr.dealloc(1);//2.釋放指標所指向的記憶體空間
intptr=nil;//3.指標設為空指標
由此可以看出,swift的記憶體釋放過程比c語言的要複雜一些。
三、在函式中的傳參中使用
1.c語言在函式傳參中使用指標。這個我們先看c語言的乙個小例子。如:
//定義乙個int型別的變數a,並給a賦值
inta=10;
//定義乙個函式,並通過該函式來修改變數a的值。
voidchangedata(int*tmpa,intvalue)
//我們來呼叫該函式來修改變數a的值
changedata(&a,100);
//列印a的值
printf("a=%d/n",a);
2.swift中使用
vartmp=20;
//在swfit中定義該函式
funcincrementor(ptr:unsafemutablepointer)
//呼叫該函式
incrementor(&tmp);
print("tmp=/(tmp)");
在swift中,還可以通過inout這關鍵字,在函式中使用
//定義函式,使用關鍵字inout
functestpointuse(inoutnum:int)
//呼叫該函式,注意,這個地方的引數要傳時加上取位址符號。
testpointuse(&tmp);
print("tmp=/(tmp)");
四、指向陣列的指標
在swift中,如何用指標指向陣列呢?
//定義乙個swift的陣列
vararray=[1,2,3,4,5];
//定義乙個指向該陣列的指標,引數是陣列的位址和陣列的count
vararrayptr=unsafemutablebufferpointer(start:&array,count:array.count)
varbaseptr=arrayptr.baseaddressasunsafemutablepointer;
print("baseptr.memory=/(baseptr.memory)");
print("baseptr=/(baseptr)");
baseptr.memory=10;
print("baseptr.memory=/(baseptr.memory)");
print("baseptr=/(baseptr)");
varnextptr=baseptr.successor();
print("nextptr.memory=/(nextptr.memory)");
當然這只是我一家之言,大家對文中有不對的地方,如有時間,可以多交流。
swift 生命週期 Swift 中的指標
題圖來自網際網路 指標是 c c 中乙個很重要的概念,是這些相對低階的語言的靈魂,然而 swift 似乎天生對指標十分不友好,繁瑣的用法讓很多初學者一上來十分摸不著頭腦。本文就簡單談談 swift 中指標的一些用法。為什麼要用指標?其實使用 swift 來做 ios 開發時不會經常與指標打交道,fo...
Swift 原始指標
常量,原始指標 c表達法 type const unsafepointer 原始指標 c表達法 type unsafemutablepointer 初始化 init init void init copaquepointer init unsafepointer init unsafemutable...
swift 函式 函式指標
main.swift functiontest 04 import foundation println 函式測試 testfunction functiontest.swift functiontest 04 import foundation 函式以func開頭 表示是乙個函式 引數和引數以,v...