第2章 c變數
當用大多數常見的指令碼程式語言編寫乙個程式時,幾乎不必花時間來考慮變數。只是在使用變數時才建立它們,並且不必擔心用完它們之後會發生些什麼。語言的直譯器會負責所有的細節。
當你在編譯語言中編寫**時,事情就沒那麼簡單了。必須告訴編譯器每個變數的型別和名稱,以宣告任何將要在程式中使用的變數。編譯器隨後檢視變數的宣告型別,為其保留相應數目的位元組,並且將變數名與這些位元組關聯起來。
本章我們將介紹objective-c中變數宣告的形式,以及編譯器如何儲存各種不同的變數。
2.1 objective-c程式的記憶體布局
要理解本章的內容,就要知道objective-c程式是如何管理記憶體的。圖2-1給出了執行程式的虛擬位址空間的乙個簡圖。
注意 虛擬位址空間是程式「看到的」位址空間。虛擬位址空間和實際的實體地址空間之間的轉換,由作業系統和計算機的記憶體管理單元(memory management unit,mmu)隱式地進行。
文字段包含了程式的可執行**和唯讀的資料。
資料段包含了可讀寫的資料,包括全域性變數。
堆包含了根據請求分配給程式的記憶體塊(參見本章稍後的2.6節)。當需要更多記憶體時,系統可能會向上擴充套件堆。
棧用於呼叫者函式。當呼叫乙個函式時,系統為被呼叫的函式構建乙個棧幀。棧幀是在棧的底部(最低的位址)構建的乙個記憶體區域。棧指標(它指向棧的最低位置的位址)向下移動。棧幀包含了用於被呼叫函式的引數和區域性變數的空間,以及用來儲存在函式呼叫的過程中需要儲存的任何暫存器的值的空間,還有用於一些控制資訊的空間。當函式返回時,棧指標恢復到其最初的值(較高的位址),並且控制返回給呼叫者函式。關於這一過程,需要記住的重要的一點是,當函式返回之後,其棧幀的內容就不再有效了。
from:
Objective C記憶體布局
程式是由資料和方法組成的,執行程式則需要記憶體承載,記憶體是如何承載程式中的資料和方法的,就描述了程式執行時的記憶體結構,即記憶體布局。可見,討論記憶體布局的具體細節需要在執行時。解釋 存放函式體的二進位制 也稱全域性資料區,包含的資料型別比較多,如全域性變數 靜態變數 一般常量 字串常量。其中 全...
Objective C記憶體管理
objective c的物件記憶體管理是一件非常有意思的事情,由其是在iphone嵌入式裝置中 想玩的省心點,就得熟知它的管理規則,由其是記憶體的管理機制。了解它的品性了才能在cocoa的世界裡如魚得水。否則,反之 如水得魚!1,乙個物件可以有乙個或多個擁有者 2,當它乙個擁有者都沒有時,它就會被 ...
Objective C 記憶體管理
objective c 記憶體管理 nsautoreleasepool pool nsautoreleasepool alloc init pool drain 事實上程式中可以有多個自動釋放池。自動釋放池其實並不包含實際的物件本身,僅僅是對釋放的對 象的引用。通過向目前的自動釋放池傳送一條auto...