一.成員變量 : 寫在類聲明的大括號(hào)中的變量叫成員變量 (也叫屬性/實(shí)例變量)
成員變量不可離開(kāi)類 離開(kāi)了類就不是成員變量
成員變量不能再定義的同事初始化
成員量只能通過(guò)對(duì)象來(lái)訪問(wèn)
成員變量存儲(chǔ)在堆中(當(dāng)前對(duì)象對(duì)應(yīng)的堆得存儲(chǔ)空間中) 不會(huì)被系統(tǒng)自動(dòng)釋放 只能有程序員手動(dòng)釋放
二.局部變量 :寫在代碼塊或函數(shù)中的變量為局部變量
局部變量的作用域 : 從定義的那一行開(kāi)始,一直到遇到大括號(hào)或return(也就是這個(gè)變量所在的代碼塊或函數(shù)結(jié)束時(shí))
局部變量可以先定義后初始化,也可以在定義的同時(shí)就初始化
局部變量存儲(chǔ)在棧里面 系統(tǒng)會(huì)自動(dòng)釋放
三.全局變量 : 卸載函數(shù)外或大括號(hào)外的變量就是全局變量
全局變量的作用域 : 從定義哪行開(kāi)始 到文件末尾
全局變量可以向定義再初始化,也可以定義的同時(shí)初始化
全局變量存儲(chǔ)在靜態(tài)區(qū)中 程序啟動(dòng)時(shí)就會(huì)分配存儲(chǔ)空間 直到程序結(jié)束才會(huì)釋放
全局變量與全局靜態(tài)變量的區(qū)別:
(a)若程序由一個(gè)源文件構(gòu)成時(shí)乍炉,全局變量與全局靜態(tài)變量沒(méi)有區(qū)別绢片。
(b)若程序由多個(gè)源文件構(gòu)成時(shí)滤馍,全局變量與全局靜態(tài)變量不同:全局靜態(tài)變量使得該變量成為定義該變量的源文件所獨(dú)享,即:全局靜態(tài)變量對(duì)組成該程序的其它源文件是無(wú)效的底循。
(c)具有外部鏈接的靜態(tài)巢株;可以在所有源文件里調(diào)用;除了本文件熙涤,其他文件可以通過(guò)extern的方式引用阁苞;
靜態(tài)全局變量的作用:
(a)不必?fù)?dān)心其它源文件使用相同變量名,彼此相互獨(dú)立祠挫。
(b)在某源文件中定義的靜態(tài)全局變量不能被其他源文件使用或修改那槽。
(c) 只能在本文件中使用!具有內(nèi)部鏈接的靜態(tài)等舔;不允許在其他文件里調(diào)用骚灸;
接下來(lái),Xcode創(chuàng)建一個(gè)工程软瞎,并且創(chuàng)建一個(gè)繼承于UIView的MyView(為了驗(yàn)證在兩個(gè)不同的 .m 文件中全局變量和靜態(tài)全局變量的使用):
1 兩個(gè).m文件中同樣的全局
我的理解是:同一個(gè)工程中逢唤,兩個(gè)不同 .m 文件中同樣的全局變量不能同時(shí)存在,因?yàn)檫@樣在編譯或運(yùn)行的時(shí)候涤浇,編譯器分不清是哪個(gè)全局變量,所以我們千萬(wàn)不能同時(shí)在同一個(gè)工程中定義同樣的全局變量魔慷!
2 一個(gè).m文件使用另一個(gè).m文件中的全局變量
問(wèn)題來(lái)了只锭,如果我就是想用另一個(gè) .m 文件中的全局變量,那怎么處理呢院尔?很簡(jiǎn)單蜻展,使用關(guān)鍵字 extern 修飾使用的全局變量就好了,也即是在
import “ViewController.h”中:
//加上關(guān)鍵字extern邀摆,表示這里要使用到MyView中的全局變量
extern NSInteger CellHeight;
打印結(jié)果:0纵顾。因?yàn)楫?dāng)沒(méi)有初始化的時(shí)候系統(tǒng)默認(rèn):零。
注:如果在MyView中初始化了數(shù)據(jù)栋盹,比如NSInteger CellHeight = 100施逾;則打印結(jié)果就為100,但是在ViewController中就不能再次初始化@瘛:憾睢!否則編譯報(bào)錯(cuò)同上Uヌ馈H渌选!
3 靜態(tài)全局變量
顯然收壕,依舊報(bào)錯(cuò)妓灌!這是因?yàn)樵贛yView中是一個(gè)靜態(tài)全局變量轨蛤,盡管在ViewController使用了關(guān)鍵字extern想使用它,但還是不行的虫埂,靜態(tài)全局變量只能在本文件中使用祥山,不允許其他文件的調(diào)用!換句話說(shuō)我們可以在兩個(gè)不同的 .m 文件中定義同樣的靜態(tài)全局變量告丢,而互不干涉枪蘑、互不影響。