1跟匆、const(常量---readonly)
作用:
- 用于修飾 右邊 的基本變量或指針變量异袄;
- 被修飾的變量只讀,不能被修改(readonly);
定義的意義:
(1.) 常用使用方式:
- 常用單獨(dú)使用形式有三種:(但是一般會(huì)和其他關(guān)鍵字聯(lián)合使用)
const NSString * name = @"jack";
NSString const * sax = @"boy";
NSString * const age = @"24";
這樣定義的均為全局常量:不管你定義在那個(gè)文件夾(單獨(dú)定義現(xiàn)在只能存在于.m文件中玛臂,見:用法舉例->PS)烤蜕,在外部的任意文件中都可以訪問到。
- 和其他關(guān)鍵字結(jié)合使用的形式一般有兩種:
extern const NSString * name; // 僅做聲明使用垢揩,一般存在與.h文件中
static const NSString * name = @"jack"; // 使全局常量變?yōu)榫植孔兞烤谅蹋唧w使用后面會(huì)介紹??
(2.)const究竟做了什么?
在介紹const時(shí)著重強(qiáng)調(diào)了“右邊”二字叁巨,這是有原因的O(∩_∩)O~
在使用時(shí)我們發(fā)現(xiàn)const 修飾時(shí) 位置是不一樣的斑匪,不同位置分別代表了什么含義呢?
const NSString * name = @"jack";
// *name 不能修改 name 可以修改 ---> *name 是指向指針的指針~
NSString const * sax = @"boy";
// 與上面一樣(這就是為什么強(qiáng)調(diào)“右邊”二字了)
NSString * const age = @"24";
// *name 能修改 name 不可以修改 --->所以我們想定義一個(gè)不想被修改的常量應(yīng)該這樣
我們可以用指針變量來驗(yàn)證一下:
用法舉例:
訪問的方式一般有兩種:
(1.)在.m文件中定義锋勺,在其他文件中獲取其聲明蚀瘸,然后使用;
(2.)另一種使用時(shí)需要先在.h中聲明庶橱,然后.m中賦值贮勃,當(dāng)要使用該常量時(shí)需要導(dǎo)入定義該常量的頭文件,然后直接使用即可苏章。
PS:現(xiàn)在不能直接在.h文件中定義常量了寂嘉,會(huì)發(fā)生循環(huán)引用問題。具體見http://www.reibang.com/p/94ca52399ade該篇文章的第十五小標(biāo)題枫绅,所以現(xiàn)在常用方法是單獨(dú)創(chuàng)建一個(gè)專門存放常量的文件泉孩,使用第二種方法定義常量,然后在pch文件中導(dǎo)入該文件的頭文件并淋。
2寓搬、static (靜態(tài)的)
作用:修飾不同的變量作用不盡相同。
(1.)修飾全局變量:
static NSString * name_boy = @"Bob";
// 下面是與const結(jié)合使用的情況
static const NSString * name = @"jack";
static NSString const * sax = @"boy";
static NSString * const age = @"24";
這又分為兩種:
---》在.h中修飾全局變量:
現(xiàn)在直接在.h文件中定義全局變量或者const修飾的全局變量運(yùn)行時(shí)會(huì)直接報(bào)_x86的錯(cuò)誤县耽,但是可以使用static 修飾句喷,即可在.h文件中定義镣典,然后在其他文件中可以直接使用!
---》在.m中修飾全局變量:
改變?nèi)肿兞康淖饔糜蛲偾恚谷肿兞康淖饔糜騼H限于當(dāng)前文件內(nèi)部(.m內(nèi)部)兄春,即當(dāng)前文件內(nèi)部才能訪問該全局變量。同時(shí)這樣能夠避免重復(fù)定義全局變量锡溯!常見的使用情況:單例中神郊。
若將上圖(2-1-定義)中static const NSString * name = @"jack";
放到.m文件中則在AppDelegate.m中則訪問不到name
.
(2.)修飾局部變量:
---》改變局部變量的生命周期(只到程序結(jié)束,這個(gè)局部變量才會(huì)銷毀)不會(huì)改變局部變量的作用域趾唱;
---》讓局部變量只初始化一次涌乳,局部變量在程序中只有一份內(nèi)存
下面有一組對比來說明修飾局部變量后的變化:
可以看到甜癞,經(jīng)過static修飾后夕晓,在for循環(huán)內(nèi)部workDays只被初始化了一次。
與const結(jié)合使用:
一般是在.m文件中定義經(jīng)常使用的字符串常量悠咱,或者數(shù)值常量時(shí)使用蒸辆。static將一個(gè)全局變量變成局部變量,然后const將一個(gè)局部變量變成局部常量
e.g : MBProgressHUD.m中
3、extern(外部的析既,外部變量)
作用:
- 用來聲明全局變量躬贡;
- 只是用來獲取全局變量(包括全局靜態(tài)變量)的值,不能用于定義變量眼坏;
用法:
- 在.h中修飾聲明全局變量拂玻,然后在.m中定義該全局變量,則在其他文件中可以直接使用該變量宰译!
- 獲取全局變量的值(具體用法參考本篇文章中const篇幅中 -> 用法舉例 中的(1.)檐蚜;
與const結(jié)合使用:
即,在.h中聲明一個(gè)const修飾的全局變量沿侈,讓后再在.m中實(shí)現(xiàn)其定義闯第。(這樣逼格看起來要高一些,其實(shí)就是定義了一個(gè)全局變量~)
在這里還有一些關(guān)鍵字UIKIT_EXTERN缀拭、OBJC_EXTERN咳短、FOUNDATION_EXTERN丘侠、FOUNDATION_EXPORT隶症、FOUNDATION_IMPORT,這些均為經(jīng)過處理的extern.
- UIKIT_EXTERN:將函數(shù)/變量修飾為兼容以C編譯方式的、具有extern屬性的屬性伸眶。
- OBJC_EXTERN:與UIKIT_EXTERN差不多铣鹏,但是比其更加寬泛一些敷扫。
- FOUNDATION_EXTERN:看其定義是與OBJC_EXTERN一毛一樣的······
- FOUNDATION_EXPORT/FOUNDATION_IMPORT:用來兼容win32應(yīng)用程序,同時(shí)也是為了兼容C++語言的~~(不明覺厲??)
若是使用以上字段是不是看起來逼格又高了一點(diǎn)~~哀蘑,不過通常使用最多的也就是 UIKIT_EXTERN了诚卸。
4葵第、typedef(定義類型)
作用:定義類型的別名。
(1.)定義枚舉:
typedef NS_ENUM(NSInteger, UITableViewStyle) {
UITableViewStylePlain,
UITableViewStyleGrouped
};
typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
UISwipeGestureRecognizerDirectionRight = 1 << 0,
UISwipeGestureRecognizerDirectionLeft = 1 << 1,
UISwipeGestureRecognizerDirectionUp = 1 << 2,
UISwipeGestureRecognizerDirectionDown = 1 << 3
};
//凡是需要以按位或操作來組合的枚舉都應(yīng)使用NS_OPTIONS定義合溺。若是枚舉不需要互相組合卒密,則應(yīng)使用NS_ENUM來定義
(2.)定義block:
typedef void (^JRNetWorkSuccessBlock)(id responseObject, MBProgressHUD * hud);
(3.)添加別名:
typedef NSString Str;
// 這樣再定義string類型時(shí),也可以直接使 Str
// e.g @property (copy, nonatomic) Str * name;
5棠赛、typeof(變量名哮奇,類型)
作用:靜態(tài)獲取參數(shù)類型。
最常見就是自定義block中防止循環(huán)引用:
__weak typeof(self)weakSelf = self;
self.channelHeaderView.addAction = ^{
[[UIApplication sharedApplication].keyWindow addSubview:weakSelf.channelView];
};
6睛约、define(定義)
作用:主要是用于定義宏
關(guān)于宏定義可以看一下我的這篇文章 《iOS預(yù)編譯指令詳解》鼎俘。對于經(jīng)常使用的一些常量最好使用const而不是定義成宏。