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