iOS 靜態、全局變量、常量


關鍵字static

  • 兩個概念:生命周期、作用域
    生命周期:這個變量能存活多久,它所占用的內存什么時候分配,什么時候收回。
    作用域:這個變量在什么區域是可見的,可以拿來用的。

static分兩種情況:修飾局部變量、修飾全局變量

1、static修飾局部變量
局部變量:在函數/方法/代碼塊內聲明的變量。它的生命周期、作用域都是在這個代碼塊內。

局部變量 存儲在棧區(stack)
一旦出了這個代碼塊,存儲局部變量的這個棧內存就會被回收,局部變量也就被銷毀。

當用static修飾局部變量時,變量被稱為靜態局部變量,和全局變量,靜態全局變量一樣,是存儲在‘靜態存儲區’。

存儲在 靜態存儲區 的變量,其內存直到 程序結束 才會被銷毀。
即,生命周期是整個源程序。

靜態局部變量的生命周期是整個源程序,但,作用域是聲明它的代碼塊內。

2、static修飾全局變量

  • 當全局變量沒有使用static修飾時
    其存儲在靜態存儲區,直到程序結束才銷毀。也就是其作用域是整個源程序。
    我們可以使用extern關鍵字來引用這個全局變量。

  • 當全局變量使用static修飾時
    其生命周期沒有變,依舊是在程序結束時才銷毀。但是其作用域變了。現在只限於申明它的這個文件才可見。
    使用extern關鍵字無法引用這個全局變量。

全局變量本來是在整個源程序的所有文件都可見,static修飾后,改為只在申明自己的文件可見,即修改了作用域。

static int num; //僅本文件可見 @implementation @end 

關鍵字const

主要強調變量是不可修改的。
const修飾的是其右邊的值,也就是const右邊的這個整體的值不能改變。

static NSString const *name = @"abc"; static const NSString *name = @"bac"; //兩種寫法等價 // name是 指針變量, *name是 指針指向的變量的值 
  • *是指針指向符,主要看*const的前后關系
NSString const *str = @"abc"; // 值不變 

1、const 在*前:
const修飾*str這個整體,所以這個整體不能改變,這個整體是str指向的內存中的

NSString * const str = @"abc"; // 地址不變 

2、const 在*后:
表示str指向的地址不能改變

關鍵字extern

主要是用來引用全局變量,它的原理是先在本文件中查找,查找不到再到其他文件中查找。

.h中

@interface PDConst : NSObject extern NSString *const appBaseURL; @end 

.m中

@implementation PDConst NSString *const currentBaseURL = @"http://192...."; @end


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM