前言
我們在日常開發中經常會用到常量定義、靜態變量、靜態全局變量的使用,這時就會使用到static、extern和const關鍵字,在這里簡單的記錄下static和extern這兩個關鍵字的使用。
static
static影響變量的生命周期和變量的作用域。static的使用分為兩種情況:1、修飾局部變量;2、修飾全局變量;使用static修飾的變量只會初始化一次, 并在內存中分配在靜態存儲區,變量在整個程序執行期間不釋放,其所分配的空間始終存在;
- 修飾局部變量:
- 在函數、方法、代碼塊內聲明的變量;
- 使局部變量只初始化一次;
- 局部變量的作用域未改變,但生命周期改變了,生命周期是整個源程序,作用域是聲明它的代碼塊內;
- 局部變量本來存儲在棧區,一旦出了這個代碼塊,存儲局部變量的這個棧內存就會被回收,局部變量也就被銷毀。使用static修飾后變量存儲在靜態存儲區;
- (IBAction)tapEvent:(id)sender {
//定義一個局部靜態變量
static int i=0;
//每次點擊都+1
i ++;
NSLog(@"i=%d",i);
}
//輸出結果
2021-03-18 10:15:57.971470+0800 WYHStaticExternDemo[6812:4572201] i=1
2021-03-18 10:15:58.270829+0800 WYHStaticExternDemo[6812:4572201] i=2
2021-03-18 10:15:58.428740+0800 WYHStaticExternDemo[6812:4572201] i=3
- 修飾全局變量:
- 不會修改全局變量的生命周期,其存儲在靜態存儲區,直到程序結束才銷毀;
- 會修改全局變量的作用域,變量的作用域只限于聲明它的本文件訪問使用;
- 避免重復定義全局變量;
注意:1、當靜態全局變量聲明在.h頭文件時,其他類引用靜態全局變量所在類頭文件后可以訪問。2、初始化的全局變量和靜態變量存放在一塊區域(數據段),未初始化的全局變量和靜態變量存放在一塊區域(BSS段)
- 修飾函數/方法
被修飾的函數或方法稱為靜態函數,使外部文件無法訪問這個函數,僅本文件可以訪問。在OC中很少使用。
extern
extern翻譯是"外部的",用來引用全局變量,用來獲取全局變量(包括全局靜態變量)的值,不能用于定義變量,當使用全局變量時首先會在當前文件中查找,如果沒有查找到會再到其他文件中查找變量,在多個文件中定義相同名稱的全局變量會報處重復定義的錯誤。
注:聲明可以多次,定義只能一次
- 使用方式1:定義的時候不使用extern修飾,在使用的時候通過extern聲明,調用全局變量。
A方法:
#import <Foundation/Foundation.h>
@interface Person : NSObject
@end
#import "Person.h"
NSString *name = @"Tom";
@implementation Person
@end
B方法.m:
#import <Foundation/Foundation.h>
@interface School : NSObject
@end
#import "School.h"
@implementation School
extern NSString *name;
NSLog(@"%@", name);
@end
- 使用方式2:在A類的.h頭文件使用extern聲明全局變量,在A類的.m中初始化全劇變量的值,在B類中導入A類后可以直接訪問全局變量
#import <Foundation/Foundation.h>
extern NSString *name;
@interface Person : NSObject
@end
#import "Person.h"
NSString *name = @"Tom";
@implementation Person
@end