一.成員變量 : 寫在類聲明的大括號中的變量叫成員變量 (也叫屬性/實例變量)
成員變量不可離開類 離開了類就不是成員變量
成員變量不能再定義的同事初始化
成員量只能通過對象來訪問
成員變量存儲在堆中(當前對象對應的堆得存儲空間中) 不會被系統自動釋放 只能有程序員手動釋放
二.局部變量 :寫在代碼塊或函數中的變量為局部變量
局部變量的作用域 : 從定義的那一行開始,一直到遇到大括號或return(也就是這個變量所在的代碼塊或函數結束時)
局部變量可以先定義后初始化,也可以在定義的同時就初始化
局部變量存儲在棧里面 系統會自動釋放
三.全局變量 : 卸載函數外或大括號外的變量就是全局變量
全局變量的作用域 : 從定義哪行開始 到文件末尾
全局變量可以向定義再初始化,也可以定義的同時初始化
全局變量存儲在靜態區中 程序啟動時就會分配存儲空間 直到程序結束才會釋放
全局變量與全局靜態變量的區別:
(a)若程序由一個源文件構成時,全局變量與全局靜態變量沒有區別。
(b)若程序由多個源文件構成時,全局變量與全局靜態變量不同:全局靜態變量使得該變量成為定義該變量的源文件所獨享,即:全局靜態變量對組成該程序的其它源文件是無效的。
(c)具有外部鏈接的靜態;可以在所有源文件里調用;除了本文件,其他文件可以通過extern的方式引用;
靜態全局變量的作用:
(a)不必擔心其它源文件使用相同變量名,彼此相互獨立。
(b)在某源文件中定義的靜態全局變量不能被其他源文件使用或修改。
(c) 只能在本文件中使用!具有內部鏈接的靜態;不允許在其他文件里調用;
接下來,Xcode創建一個工程,并且創建一個繼承于UIView的MyView(為了驗證在兩個不同的 .m 文件中全局變量和靜態全局變量的使用):
1 兩個.m文件中同樣的全局
我的理解是:同一個工程中,兩個不同 .m 文件中同樣的全局變量不能同時存在,因為這樣在編譯或運行的時候,編譯器分不清是哪個全局變量,所以我們千萬不能同時在同一個工程中定義同樣的全局變量!
2 一個.m文件使用另一個.m文件中的全局變量
問題來了,如果我就是想用另一個 .m 文件中的全局變量,那怎么處理呢?很簡單,使用關鍵字 extern 修飾使用的全局變量就好了,也即是在
import “ViewController.h”中:
//加上關鍵字extern,表示這里要使用到MyView中的全局變量
extern NSInteger CellHeight;
打印結果:0。因為當沒有初始化的時候系統默認:零。
注:如果在MyView中初始化了數據,比如NSInteger CellHeight = 100;則打印結果就為100,但是在ViewController中就不能再次初始化!!!否則編譯報錯同上!!!
3 靜態全局變量
顯然,依舊報錯!這是因為在MyView中是一個靜態全局變量,盡管在ViewController使用了關鍵字extern想使用它,但還是不行的,靜態全局變量只能在本文件中使用,不允許其他文件的調用!換句話說我們可以在兩個不同的 .m 文件中定義同樣的靜態全局變量,而互不干涉、互不影響。