1.局部變量
概念
局部變量就是定義在函數(shù), 代碼塊和函數(shù)形參列表中的變量, 我們就稱之為局部變量
作用范圍
從定義的那一行開始一直直到遇到大括號結束或者遇到return為止
特點:
相同作用域范圍內不能出現(xiàn)同名的局部變量
不同作用域范圍內出現(xiàn)同名的局部變量, 內部的局部變量會覆蓋外部的局部變量
注意:
局部變量沒有固定的初始化值, 如果沒有對局部變量進行初始化, 那么局部變量中是一些隨機的值, 所以在開發(fā)中千萬不要使用未初始化的局部變量
存儲位置:
局部變量存儲在棧中, 當作用域結束系統(tǒng)會自動釋放棧中的局部變量
2.全局變量
概念
寫在函數(shù),代碼塊,形參列表外的變量, 我們就稱之為全局變量
作用范圍: 從定義的那一行開始一直直到文件末尾(暫時這樣認為)
特點
全局變量和局部變量可以同名
如果存在和全局變量同名的局部變量, 那么局部變量會覆蓋全局變量
注意:
全局變量如果沒有進行初始化, 那么系統(tǒng)默認會將全局變量初始化為0
存儲位置:
全局變量存儲在靜態(tài)區(qū)中, 他會隨著程序的啟動而創(chuàng)建, 隨著程序的結束而結束
3.內部全局變量和外部全局變量
(1)全局變量分為兩種:
1)外部全局變量, 默認情況下所有的全局變量都是外部全局變量
什么是外部全局變量? 可以被其它文件訪問的全局變量我們稱之為外部全局變量
2)內部全局變量, 只要給全局變量加上static關鍵字就是內部全局變量
什么是內部全局變量? 只能被當前文件訪問的全局變量我們稱之為內部全局變量
(2) 外部全局變量有一個特點:
可以定義同名的外部全局變量
多個同名的外部全局變量指向同一塊存儲空間
內部全局變量有一個特點
也可以定義多個同名的內部全局變量
多個同名的全局變量如果不在同一個文件中, 那么指向不同的存儲空間
(3)static
為了提高數(shù)據(jù)的安全性, 不讓別人在其它文件中修改我們的全局變量,
C語言提供了另外一個用于修改全局變量的關鍵字, static
只要用static修改的全局變量就是內部全局變量, 只能在當前文件中使用
這樣就可以提高我們全局變量的安全性
如果多個文件中存在同名的內部全局變量, 相互不會影響
如果既有外部全局變量也有內部全局變量, 那么會優(yōu)先訪問內部全局變量
extern:
用于聲明一個外部全局變量
聲明只需要在使用變量之前聲明就可以了
static:
用于定義一個內部全局變量
(4)聲明和定義的區(qū)別:
聲明不會開辟存儲空間
定義會開辟存儲空間
4.static對局部變量的作用
(1)當使用static來修飾局部變量, 那么會延長局部變量的生命周期, 并且會更改局部變量存儲的位置 , 將局部變量從棧轉移到靜態(tài)區(qū)中
(2)只要使用static修改局部變量之后, 當執(zhí)行到定義局部變量的代碼就會分配存儲空間, 但是只有程序結束才會釋放該存儲空間,靜態(tài)區(qū)地址賦值后不能更改。
5.extern和static對函數(shù)的作用
(1)函數(shù)也分為內部函數(shù)和外部函數(shù)
默認情況下所有的函數(shù)都是外部函數(shù)
什么是外部函數(shù)? 可以被其它文件訪問的函數(shù)稱之為外部函數(shù)
什么是內部函數(shù)? 只能在當前文件中訪問的函數(shù)稱之為內部函數(shù)
(2) 只要在函數(shù)的返回值前面加上一個extern就可以讓函數(shù)變?yōu)橐粋€外部函數(shù), 由于默認就是外部函數(shù), 所以在開發(fā)中一般情況extern沒人寫
如果extern寫在函數(shù)的實現(xiàn)中, 代表定義一個外部函數(shù)
如果extern寫在函數(shù)的聲明中, 代表聲明一個外部函數(shù)
(3) 只要在函數(shù)的返回值前面加上static就可以讓函數(shù)變?yōu)閮炔亢瘮?shù), 其它文件就不能訪問了
如果static寫在函數(shù)的實現(xiàn)中, 代表定義一個內部函數(shù)
如果static寫在函數(shù)的聲明中, 代表聲明一個內部函數(shù)
5.const的用法
(1) const在指針中的用法
如果const寫在指針類型的左邊, 那么意味著指向的內存空間中的值不能改變, 但是指針的指向可以改變
如果const寫在指針的數(shù)據(jù)類型和*號之間, 那么意味著指向的內存空間中的值不能改變, 但是指針的指向可以改變
如果const寫在指針的右邊(數(shù)據(jù)類型 * const), 那么意味著指針的指向不可以改變, 但是指針指向的存儲空間中的值可以改變
const char *name = "lnj";
int const *p = #
int * const p = #
(2) const對基本數(shù)據(jù)類型的作用
const對基本數(shù)據(jù)類型的作用, 可以讓基本數(shù)據(jù)類型的變量變?yōu)槌A? const有兩種寫法, 1.寫在數(shù)據(jù)類型的左邊, 2.寫在數(shù)據(jù)類型的右邊
const int num = 10;
int const num = 10;
6.成員變量膘魄、全局變量和局部變量對比
(1)寫在類聲明的大括號中的變量, 我們稱之為 成員變量(屬性, 實例變量)
成員變量只能通過對象來訪問
注意: 成員變量不能離開類, 離開類之后就不是成員變量
成員變量不能在定義的同時進行初始化
存儲: 堆(當前對象對應的堆的存儲空間中)
存儲在堆中的數(shù)據(jù), 不會被自動釋放, 只能程序員手動釋放,或者等對象釋放的時候乌逐,它也會釋放
(2)寫在函數(shù)和大括號外部的變量, 我們稱之為全局變量
作用域: 從定義的那一行開始, 一直到文件末尾
局部變量可以先定義在初始化, 也可以定義的同時初始化
存儲: 靜態(tài)區(qū)
程序一啟動就會分配存儲空間, 直到程序結束才會釋放
(3)寫在函數(shù)或者代碼塊中的變量, 我們稱之為局部變量
作用域: 從定義的那一行開始, 一直到遇到大括號或者return
局部變量可以先定義再初始化, 也可以定義的同時初始化
存儲 : 棧
存儲在棧中的數(shù)據(jù)有一個特點, 系統(tǒng)會自動給我們釋放
7.iOS中全局變量的幾種使用方法
(1)在AppDelegate中聲明并初始話全局變量
在需要使用的地方插入以下代碼,在ios中 AppDelegate被設計成了單例模式
AppDelegate *appDelegate = [[UIApplication shareApplication] delegate];
appDelegae.your_var
(2)使用extern關鍵字创葡,extern可以理解為外部引入的意思
1浙踢、單獨新建一個example.h文件,文件名自己取灿渴,用于存放所有的全局變量
2洛波、在該文件中寫入你要定義的變量名胰舆,定義時不能初始化,如:
NSString *str;
int number;
3蹬挤、在需要使用的地方引入頭文件
#import "example.h"
4缚窿、給全局變量初始化或者賦值
extern NSString *str = [[NSString alloc] initWithFormat:@"abcd"];
extern int number = 1;
(3)使用單例
interface Singleton : NSObject
+ (Singleton *)sharedSingleton;
@property (nonatomic,copy) NSString *testGlobal;
@end
@implementation Singleton
+ (Singleton *)sharedSingleton
{
static Singleton *sharedSingleton;
@synchronized(self)
{
if (!sharedSingleton)
sharedSingleton = [[Singleton alloc] init];
return sharedSingleton;
}
}
@end
使用如:
[Singleton sharedSingleton].testGlobal = @"test";