1. 程式人生 > >Objective-C指標、棧幀、棧

Objective-C指標、棧幀、棧

1、Objective-C的指標是用來只是物件的,例如:

NSString *someString = @“The string”;

這種語法基本上是照搬C語言的,聲明瞭一個名為someString的變數,其型別為NSString* ,也就是說此變數為指向NSString的指標。

所有Objective-C的物件都必須這樣宣告,因為物件所佔記憶體總是分配在“堆空間(heap space)”,而不會分配在“棧(stack)”上。

2、NSString *someString = @“The string”;

NSString *anotherString = someString;

someString變數指向分配在堆中的某塊記憶體,anotherString為又建立一個變數指向同一個地址,並不是拷貝此物件,只是someString和anotherString兩個變數指向同一個物件,

兩個變數都是NSString *型,這說明當前“棧幀(stack frame)”中分配了兩塊記憶體,每塊記憶體的大小都能容下一枚指標(32位計算機上是4位元組,64位計算機是8位元組),這兩塊記憶體裡的只都是一樣的,就是NSString例項的記憶體地址

分配在堆中記憶體必須直接管理,二分配在棧上用於儲存變數的記憶體則會在其棧幀彈出時自動清理,Objective-C將記憶體管理抽象出來了,不需要用malloc及free來分配或釋放記憶體,Objective-C執行期環境把這部分工作抽象為一套記憶體管理架構,名為“引用計數”。

在Objective-C中也有不含*的變數,也可能會使用棧空間,這些變數儲存的不是物件,比如CGRect(結構體),整個系統框架都在用這種結構體,如果改用Objective-C物件來做的話,效能會受到影響。