C:static 關鍵字、靜態變數、跨類訪問資料

weixin_30588675發表於2020-04-05

static 在OC中的使用 參考1   參考2   參考3   參保4    參考5

跨類訪問成員 參考 

+號方法就是類方法(靜態方法),說明不用建立物件,可以直接通過型別去直接呼叫這個方法,在OC中不能用非靜態物件去呼叫。

-號方法是物件方法,標誌-號後的方法必須通過本類的物件或者在本來中才可以使用。

總結:

跨類訪問資料使用到的方法有:使用單例(如使用Appdelelgate單例訪問資料)、使用 extern 關鍵字修飾、block 傳遞、代理傳遞。

其中使用extern關鍵字訪問全域性的資料變數,只需要兩步:

(1)在.m的@implementation 的外面定義一個變數

(2)在要使用到的類中 用 extern 修飾你在第一個步驟中定義的變數,就可以跨類訪問。

 

    靜態變數與自動變數的本質區別是,靜態變數並不像自動變數那樣使用堆疊機制來使用記憶體。而是為靜態變數分配固定的記憶體,在程式執行的整個過程中,它都會被保持,而不會被銷燬。這就是說靜態變數的持續性是程式執行的整個週期。這有利於我們共享一些資料。如果靜態變數在函式內部定義,則它的作用域就是在這個函式內部,僅在這個函式內部使用它才有效,但是它不同於自動變數的,自動變數離開函式後就會被銷燬,而靜態變數不會被銷燬。他在函式的整個執行週期內都會存在。在函式外面定義的變數為全域性變數,工程內的所有檔案都可以訪問他,但是它在整個工程內只能定義一次,不能有重複的定義,不然就會發生錯誤,而其他的檔案要想使用這個變數,必須用extern來宣告這個變數,這個宣告叫做引用宣告。這一點很重要,如果你沒有用extern 來宣告在其他檔案中已經定義的全域性變數,就來使用它,就會發生錯誤如果你只是想在定義他的檔案中使用它,而不允許在其他的檔案中使用它,那麼就用關鍵字static來在函式外面宣告變數。這樣這個變數在其他檔案中將不可見,即它的連線性而內部連結。有一點是我們只得注意的像:如果你在函式外這樣宣告一個變數,const int a ; 變數a的連線性為內部連結,只能在定義他的檔案內使用。還有如果你在定義靜態變數的時候並沒有給變數初始化,則靜態變數將被自動初始化為0;

自動變數,只在定義它們的時候才建立,在定義它們的函式返回時系統回收變數所佔儲存空間。對這些變數儲存空間的分配和回收是由系統自動完成的。一般情況下,不作專門說明的區域性變數,均是自動變數。自動變數也可用關鍵字auto作出說明。例如:
void f()/**/
{/**/
auto int c=3;/*c為自動變數*/
int x=2;/*x未說明儲存型別,則為預設型別(自動)*/
}/**/
自動變數只有一種儲存方式,就是儲存在棧中。由於自動變數儲存在棧中,所以自動變數的作用域只在函式內,其生命週期也只持續到函式呼叫的結束。[1]
2區別
編輯

自動變數
什麼是自動變數呢?自動變數就是指在函式內部定義使用的變數。他只是允許在定義他的函式內部使用它。在函式外的其他任何地方都不能使用的變數。自動變數是區域性變數,即它的區域性是在定義他的函式內部有效。當然這說明自動變數也沒有連結性,因為它也不允許其他的檔案訪問他。由於自動變數在定義他的函式的外面的任何地方都是不可見的,所以允許我們在這個函式外的其他地方或者是其他的函式內部定義同名的變數,他們之間不會發生衝突的。因為他們都有自己的區域性,而且它沒有連結性(即:不允許其他的檔案訪問他的)。來看看自動量的持續性。計算機在執行這個函式的時候,建立併為它分配記憶體,當函式執行完畢返回後,自動變數就會被銷燬。這個過程是通過一個堆疊的機制來實現的。為自動變數分配記憶體就壓棧,而函式返回時就退棧。
/* auto */
#include <stdio.h>
int main()
{
int print();
int var,i;
for(i=0;i<=10;i++)
var=print();
printf("%d\n",var);
return 0;
}
int print()
{
auto int i=0; /* 自動變數 */
i+=1;
printf("%d\n",i);
return i;
}
/* end */


靜態變數:
靜態變數與自動變數的本質區別是,靜態變數並不像自動變數那樣使用堆疊機制來使用記憶體。而是為靜態變數分配固定的記憶體,在程式執行的整個過程中,它都會被保持,而不會被銷燬。這就是說靜態變數的持續性是程式執行的整個週期。這有利於我們共享一些資料。如果靜態變數在函式內部定義,則它的作用域就是在這個函式內部,僅在這個函式內部使用它才有效,但是它不同於自動變數的,自動變數離開函式後就會被銷燬,而靜態變數不會被銷燬。他在函式的整個執行週期內都會存在。在函式外面定義的變數為全域性變數,工程內的所有檔案都可以訪問他,但是它在整個工程內只能定義一次,不能有重複的定義,不然就會發生錯誤,而其他的檔案要想使用這個變數,必須用extern來宣告這個變數,這個宣告叫做引用宣告。這一點很重要,如果你沒有用extern 來宣告在其他檔案中已經定義的全域性變數,就來使用它,就會發生錯誤如果你只是想在定義他的檔案中使用它,而不允許在其他的檔案中使用它,那麼就用關鍵字static來在函式外面宣告變數。這樣這個變數在其他檔案中將不可見,即它的連線性而內部連結。有一點是我們只得注意的像:如果你在函式外這樣宣告一個變數,const int a ; 變數a的連線性為內部連結,只能在定義他的檔案內使用。還有如果你在定義靜態變數的時候並沒有給變數初始化,則靜態變數將被自動初始化為0;
/* static */
#include <stdio.h>
int main()
{
int print();
int var,i;
for(i=0;i<=10;i++)
var=print();
printf("%d",var);
return 0;
}
int print()
{
static int i; /*靜態變數*/
i+=1;
printf("%d\n",i);
return i;
}
/* end */

 

轉載於:https://www.cnblogs.com/benpaobadaniu/p/5074657.html

相關文章