讀第三方開(kāi)源框架SDWebImage隨筆
1,extern 作用:可以訪問(wèn)外部文件的變量。
定義一個(gè)GFA.h 和 GFA.m
在GFA.m的@implement 下面定義一個(gè)int a =20;
我們可以在viewcontroller中不用導(dǎo)入GFA的頭文件下訪問(wèn) a變量
eg:extern int a; 這個(gè)時(shí)候并不是定義變量a 而是拿到變量 a 也可以修改 a = 10;
2,const 修飾距離const右邊最近的變量 英文單詞翻譯過(guò)來(lái)就是常量的意思 可以修飾右邊的基本變量和指針變量
被const修飾過(guò)的變量只能讀,不能修改
int??const??*p???//??*p只讀?;p變量
int??*?const??p??//?*p變量?;?p只讀
const??int???*?const?p?//p和*p都只讀
int??const??*?const??p???//p和*p都只讀
注: 判斷p 和p是只讀還是變量,關(guān)鍵是看const在誰(shuí)前面。如果只在p前面,那么p只讀,p還是變量;如果在p前面,那么p只讀 ,p變量。
//定義一個(gè)全局只讀變量
NSString??*?const kuserName =?@"appkey";
//static修飾后此全局變量只能本文件訪問(wèn)
static?NSString?*const?Key?=?@"hello”;
3,static? ?a: 修飾局部變量 保證局部變量永遠(yuǎn)只初始化一次,在程序的運(yùn)行過(guò)程中永遠(yuǎn)只有一份內(nèi)存, ?生命周期類(lèi)似全局變量了 作用域還是在函數(shù)范圍內(nèi)
-(void)touchesBegan:(NSSet?*)touches?withEvent:(UIEvent?*)event
{????//聲明一個(gè)局部變量x
????int x =?0;????//每次點(diǎn)擊view來(lái)到這個(gè)方法時(shí)讓i自增
? ? x ++;????//打印結(jié)果
????NSLog(@"i=%d",x);
}
b:修飾全局變量
使全局變量的作用域僅限于當(dāng)前文件內(nèi)部,即當(dāng)前文件內(nèi)部才能訪問(wèn)該全局變量。
iOS中在一個(gè)文件聲明的全局變量,工程的其他文件也是能訪問(wèn)的,但是我又不想讓其他文件訪問(wèn),這時(shí)就可以用static修飾它了,比較典型的是使用GCD一次性函數(shù)創(chuàng)建的單例,全局變量基本上都會(huì)用static修飾。
下面是一個(gè)GCD一次函數(shù)創(chuàng)建的單利
@implementation?LoginTool
//static修飾全局變量,讓外界文件無(wú)法訪問(wèn)
static?LoginTool?*_sharedManager?=?nil;
+?(LoginTool?*)sharedManager?{???
???static?dispatch_once_t?oncePredicate;???
???dispatch_once(&oncePredicate,?^{
????????_sharedManager?=?[[self?alloc]?init];
????});???
???return?_sharedManager;
}
inline
在iOS中的一些框架中,static inline是經(jīng)常出現(xiàn)的關(guān)鍵字組合.
static自不用多說(shuō),表示在當(dāng)前文件中應(yīng)用,如 static A, 在其它文件中也可以出現(xiàn)static A.不會(huì)導(dǎo)致重名的錯(cuò)誤.
inline. 內(nèi)聯(lián)函數(shù).
作用:替代宏.
當(dāng)然inline函數(shù)與宏有區(qū)別,inline可以:
解決函數(shù)調(diào)用效率的問(wèn)題:
函數(shù)之間調(diào)用,是內(nèi)存地址之間的調(diào)用,當(dāng)函數(shù)調(diào)用完畢之后還會(huì)返回原來(lái)函數(shù)執(zhí)行的地址。函數(shù)調(diào)用有時(shí)間開(kāi)銷(xiāo),內(nèi)聯(lián)函數(shù)就是為了解決這一問(wèn)題。
不用inline修飾的函數(shù), 匯編時(shí)會(huì)出現(xiàn) call 指令.調(diào)用call指令就是就需要:
(1)將下一條指令的所在地址入棧
(2)并將子程序的起始地址送入PC(于是CPU的下一條指令就會(huì)轉(zhuǎn)去執(zhí)行子程序).
為什么inline能取代宏?
優(yōu)點(diǎn)相比于函數(shù):
inline函數(shù)避免了普通函數(shù)的,在匯編時(shí)必須調(diào)用call的缺點(diǎn):取消了函數(shù)的參數(shù)壓棧,減少了調(diào)用的開(kāi)銷(xiāo),提高效率.所以執(zhí)行速度確比一般函數(shù)的執(zhí)行速度要快.
2)集成了宏的優(yōu)點(diǎn),使用時(shí)直接用代碼替換(像宏一樣);
優(yōu)點(diǎn)相比于宏:
1)避免了宏的缺點(diǎn):需要預(yù)編譯.因?yàn)閕nline內(nèi)聯(lián)函數(shù)也是函數(shù),不需要預(yù)編譯.
2)編譯器在調(diào)用一個(gè)內(nèi)聯(lián)函數(shù)時(shí),會(huì)首先檢查它的參數(shù)的類(lèi)型,保證調(diào)用正確。然后進(jìn)行一系列的相關(guān)檢查,就像對(duì)待任何一個(gè)真正的函數(shù)一樣。這樣就消除了它的隱患和局限性。
3)可以使用所在類(lèi)的保護(hù)成員及私有成員。
inline內(nèi)聯(lián)函數(shù)的說(shuō)明
1.內(nèi)聯(lián)函數(shù)只是我們向編譯器提供的申請(qǐng),編譯器不一定采取inline形式調(diào)用函數(shù).
2.內(nèi)聯(lián)函數(shù)不能承載大量的代碼.如果內(nèi)聯(lián)函數(shù)的函數(shù)體過(guò)大,編譯器會(huì)自動(dòng)放棄內(nèi)聯(lián).
3.內(nèi)聯(lián)函數(shù)內(nèi)不允許使用循環(huán)語(yǔ)句或開(kāi)關(guān)語(yǔ)句.
4.內(nèi)聯(lián)函數(shù)的定義須在調(diào)用之前.