『壹』 ios static 和 default 的區別
static是靜態存儲類型,屬於局部變數,只能用於同一個函數內,在其他函數內使用是錯誤的。extern是外部存儲類型,屬於全局變數,可以用於從他定義開始的後續所有函數內。 假設 在note1.c文件中定義static int A; 那麼在note2.c文件中,是不能用A做為變數名嗎?note2.c不能引用note1.c內的A,但是可以用A做變數名,切記:雖然都是命名為A,但是他們是不同的量
『貳』 局部變數,局部靜態變數,全局變數,全局靜態變數分別存放在哪個區
局部變數: 棧區
局部靜態變數:靜態區
全局變數: 靜態區的常量區
全局靜態變數:靜態區
內存分四個區:靜態區,棧區,堆區,代碼區
『叄』 如何學習iOS開發知識
以下是我學習iOS時的學習步驟:
1、開發環境及工具。首先一定要配置好開發環境及開發工具,才能做後續的學習。
2、開發語言。這是學習iOS的重點,以後你的應用就需要使用這種語言來開發App。重要性不言而喻。這個學習的過程就是多看書,多練習。
3、iPhone/iPad 開發基礎。在這一階段你需要了解iPhone/iPad開發中常用的控制項,多做Demo,下一些別人的code,多參考研究
4、代碼的優化及復用。這一階段就需要你有更高的追求,不只是要完成功能,還有讓自己寫的代碼更優化,復用性更強
『肆』 iOS存儲空間怎麼分配的
棧區(stack)
棧區地址從高到低分配;
存放的局部變數(先進後出)一旦出了作用域就會被銷毀;
大量的局部變數,深遞歸,函數循環調用都可能耗盡棧內存而造成程序崩潰 。
堆區(heap)
堆區的地址是從低到高分配。
ARC下OC對象runloop循環結束後(kCFRunLoopBeforeWaiting後)自動釋放,CF對象需要CFRelease(CFTypeRef cf)手動釋放。
全局區/靜態區(static)
包括兩個部分:未初始化過和初始化過。(全局區/靜態區)在內存中是放在一起的,初始化的全局變數和靜態變數在一塊區域, 未初始化的全局變數和靜態變數在相鄰的另一塊區域;
eg:int a;未初始化的。int a = 10;已初始化的。
常量區
常量字元串就是放在這里,還有const常量;
代碼區
存放App代碼,4S(iOS7)只有74M;
『伍』 局部變數 全局變數 動態變數分別存儲什麼位置
在C語言裡面,局部變數,全局變數都是存貯在棧(stack)裡面的,
而所有用malloc和new這種操作符動態分配的空間則都是存貯在堆(mp)裡面的,
舉個簡單的例子:
int *ptr;
ptr =(int*)malloc(100*sizeof(int));
這兩句中,ptr這個指針變數是存貯在棧裡面,但是他所指向的內容則是在堆裡面。明白了嗎
『陸』 iOS 聲明局部變數用{}擴起來和不用{}括起來有啥區別
括起來 只能對象內部訪問,反之就是外部可訪問的
『柒』 局部變數的儲存類別是什麼變數,靜態局部變數和寄存器變數
C語言存儲類型有四種,分別是auto, extern, register, static。
1、局部變數,在沒有任何修飾的情況下,存儲類型為auto。
即定義局部變數int a;和auto int a;是相同的。
auto為預設類型。
2、靜態局部變數。
靜態局部變數是指有static修飾的局部變數,比如
static int a;
其存儲類型為static。
3、寄存器變數。
是指用register修飾的變數,比如:
register int a;
其存儲類型為register。
『捌』 局部變數、全局變數、外部變數個採用什麼存儲方式
局部變數是指在函數內部,臨時申請的內存空間,函數執行完成後就自動被釋放掉,也在程序RAM空間;全局變數是指在函數外部聲稱的變數,程序執行過程中不會被釋放,程序未退出之前,一直在程序的RAM空間;外部變數,指的是不在本文件中聲稱的全局變數。
『玖』 程序的局部變數 全局變數 動態申請數據分別存儲在什麼地方
程序的局部變數全局變數動態申請數據分別存儲在棧里。
普通局部變數在堆棧空間上分配,當局部變數的函數被多次調用時,局部變數每次在堆棧上的位置都不相同。還可以在堆上動態分配局部變數(malloc),但是要記住在耗盡堆空間後釋放zd。
內存分配上的棧空間時要注意內存的,不能分配太多的內存。如果堆棧中的空間小於請求的空間大小,則系統將顯示堆棧溢出並給出相應的異常信息。但堆不同,堆可分配空間很大。
(9)ios局部變數存儲擴展閱讀:
注意事項:
對局部變數進行分類
1.位置:編譯器將靜態局部變數放在全局存儲區域中。數據,因此盡管它是本地的,但它存在於程序的整個生命周期中(它在定義時產生,並隨著程序的結束而結束)。
2.訪問許可權:靜態局部變數只能由其作用域內的變數或函數訪問。也就是說,盡管它將存在於程序的整個生命周期中,但是其他函數和源文件不能訪問它,因為它是靜態的。
3.值:如果用戶沒有初始化靜態局部變數,編譯器會自動將其賦值為0,每次調用靜態局部變數時都會使用最後一次調用後的值。
『拾』 iOS函數壓棧機制是怎樣的
什麼是堆和棧?
一個由c/C++編譯的程序佔用的內存分為以下幾個部分
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。
2、堆區(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。
3、全局區(靜態區)(static)—,全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域, 未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程序結束後有系統釋放
4、文字常量區 —常量字元串就是放在這里的。 程序結束後由系統釋放
5、程序代碼區—存放函數體的二進制代碼。
函數壓棧是怎麼回事?
函數壓棧的本質是參數傳遞
這又跟匯編語言連系起來了.匯編語言的過程即proc可以理解成函數
比如一個最簡單的計算兩數之和函數
如果用匯編來寫估計是這樣的
sub proc
pop ax ;從stack取a 並放在AX寄存器中
pop bx ;從stack取b 並放在BX寄存器中
add ax,bx ; 計算a+b
ret //返回
sub endp
顯然要調用這個函數,你應當先把b值push進stack,然後再push a
因為stack是先進後出的
所以調用匯編像這樣
比如計算4+5
push 5;
push 4;
call sub; //返回值在AX中
在這個例子中先壓5或先壓4得到的結果沒有變化
但大多數程序,如果參數的順序錯誤將是災難性的
因為不管什麼高級語言最終都要編譯成匯編語言,然後是機器語言
同樣下面這個C程序,計算a+b值,必然會編譯成上面的匯編代碼
int sub(int a ,int b) {return a+b;}
所以C在調用這個函數sub時,必須要壓棧(即傳入參數)但這些工作,在C語言里,並不需要你來完成.你只要寫出
sub(7,9);
編譯器在編譯成匯編時就會自動完成相關的壓棧工作.
根據函數調用方式和參數壓入順序目前存在三種約定:
stdcall
cdecl
fastcall
這都相關壓棧順序和棧的清理工作約定
他們的細節都不相同,但有一點是肯定的,參數比須從右向左壓入棧中
stdcall中 函數必須自已清理棧
cdecall 由調用者清除堆棧 C的默認函數調用方式 所以這樣C支持可變參數
fastcall 是把函數參數列表的前三個參數放入寄存器eax,edx,ecx,其他參數壓棧
源代碼:
int function(int a, int b)
{
return a + b;
}
void main()
{
function(10, 20);
}
1.__cdecl
_function
push ebp
mov ebp, esp
mov eax, [ebp+8] ;參數1
add eax, [ebp+C] ;加上參數2
pop ebp
retn
_main
push ebp
mov ebp, esp
push 14h ;參數 2入棧
push 0Ah ;參數 1入棧
call _function ;調用函數
add esp, 8 ;修正棧
xor eax, eax
pop ebp
retn
2.__fastcall
@function@8
push ebp
mov ebp, esp ;保存棧指針
sub esp, 8 ;多了兩個局部變數
mov [ebp-8], edx ;保存參數 2
mov [ebp-4], ecx ;保存參數 1
mov eax, [ebp-4] ;參數 1
add eax, [ebp-8] ;加上參數 2
mov esp, ebp ;修正棧
pop ebp
retn
_main
push ebp
mov ebp, esp
mov edx, 14h ;參數 2給EDX
mov ecx, 0Ah ;參數 1給ECX
call @function@8 ;調用函數
xor eax, eax
pop ebp
retn
3.__stdcall
_function@8
push ebp
mov ebp, esp
mov eax, [ebp] ;參數 1
add eax, [ebp+C] ;加上參數 2
pop ebp
retn 8 ;修復棧
_main
push ebp
mov ebp, esp
push 14h ;參數 2入棧
push 0Ah ;參數 1入棧
call _function@8 ;函數調用
xor eax, eax
pop ebp
retn