時常在單例模式中看到static關鍵字,不明就裡照搬總歸無法了解其中的奧義,今天又寫到單例決心已定要明白static的道理于是檢視文檔,如下:
static關鍵字
前面的局部變量通常都在每次程式進入該局部變量的作用域時配置設定并在離開時釋放。這類存儲稱為自動存儲(預設關鍵字auto)。
static關鍵字會在聲明變量的時候配置設定記憶體,在程式運作期間隻配置設定一次記憶體。之後再通路時,實際都是在通路原先配置設定的記憶體。這适合用于存儲建立時使用大量的資源,并且不常改變的局部變量。
<code>void</code> <code>func() {</code>
<code> </code><code>static</code> <code>expensive * p = [[expensive alloc] init];</code>
<code> </code><code>[p dosomeop];</code>
<code>}</code>
<code>int</code> <code>main(</code><code>int</code> <code>argc, </code><code>const</code> <code>char</code> <code>* argv[])</code>
<code>{</code>
<code> </code><code>func(); </code><code>// 第一次調用時建立 p</code>
<code> </code><code>func(); </code><code>// 第二次調用,此時p已存在,不會再次建立</code>
<code> </code><code>return</code> <code>0;</code>
因為全局變量預設位于全局作用域中,是以其行為和靜态變量一樣。也就是說,它們隻配置設定一次記憶體,并在整個程式運作期間保持不變。
const關鍵字
const同樣會修改所聲明變量的記憶體行為,它所修飾的變量是隻讀的,即第一次初始化後它的值将不能改變。通常用來聲明常量。
<code>#import <foundation/foundation.h></code>
<code>{ </code>
<code> </code><code>const</code> <code>nsstring *str = @</code><code>"beijing"</code><code>;</code>
<code> </code><code>str = @</code><code>"shanghai"</code><code>; </code><code>// 會産生一個編譯錯誤</code>
<code> </code><code>nslog(@</code><code>"dd, %@"</code><code>, str);</code>