常用關(guān)鍵字理解
strong、copy、weak、assign
strong修飾的對(duì)象是強(qiáng)引用,該指針指向的對(duì)象引用計(jì)數(shù)會(huì)加1
copy修飾的對(duì)象一般為不可變數(shù)據(jù)類型,可以保證修改副本對(duì)象不影響原對(duì)象
weak修飾的對(duì)象時(shí)弱引用,該指針指向的對(duì)象引用計(jì)數(shù)不會(huì)加1
assign修飾基本數(shù)據(jù)類型如Int、CGRect、NSInteger、CGFloat、CGSize、CGSize、CGPoint等
assign不用來修飾OC是因?yàn)槠洳话踩?,不能指向的?duì)象銷毀時(shí)把指針置空;而被weak可以
nonatomic、atomic
nonatomic:非原子性,不會(huì)對(duì)賦值和取值過程加鎖
atomic:原子性,會(huì)對(duì)賦值和取值過程加鎖
atomic加鎖邏輯自iOS10之后從自旋鎖變?yōu)榛コ怄i;
atomic加鎖原理:創(chuàng)建一個(gè)PropertyLocks(鎖緩存池),通過傳入標(biāo)識(shí)(self+偏移地址)鎖定唯一屬性的方式做到setter和getter方法同時(shí)只能有一個(gè)進(jìn)行,保證安全
@synthesize 和 @dynamic的區(qū)別
- @property 會(huì)自動(dòng)合成成員變量,有兩個(gè)對(duì)應(yīng)的修飾符,一個(gè)是 @synthesize,一個(gè)是 @dynamic。如果 @synthesize和 @dynamic都沒寫,那么默認(rèn)的就是@syntheszie var = _var;
- @synthesize的語義是如果你沒有手動(dòng)實(shí)現(xiàn) setter 方法和 getter 方法,那么編譯器會(huì)自動(dòng)為你加上這兩個(gè)方法。
- @dynamic告訴編譯器:屬性的 setter 與 getter 方法由用戶自己實(shí)現(xiàn),不自動(dòng)生成。(當(dāng)然對(duì)于 readonly 的屬性只需提供 getter 即可)。編譯時(shí)沒問題,運(yùn)行時(shí)才執(zhí)行相應(yīng)的方法,這就是所謂的動(dòng)態(tài)綁定。
// 如果指定了成員變量的名稱,會(huì)生成一個(gè)指定名稱的成員變量
@synthesize firstName = _myFirstName;
在有了自動(dòng)合成屬性實(shí)例變量之后,@synthesize還有哪些使用場景?
回答這個(gè)問題前,我們要搞清楚一個(gè)問題,什么情況下不會(huì)自動(dòng)合成成員變量?
1)同時(shí)重寫了 setter 和 getter 時(shí)
2)重寫了只讀屬性的 getter 時(shí)
3)使用了 @dynamic 時(shí)
4)在 @protocol 中定義的所有屬性
5)在 category 中定義的所有屬性
6)重載的屬性
extern和static的區(qū)別
全局變量分兩種:外部變量、內(nèi)部變量
外部變量:定義的變量能被本文件和其他文件訪問
- 默認(rèn)情況下,所有的全局變量都是外部變量
- 不同文件中的同名外部變量都代表同一個(gè)變量
定義一個(gè)外部變量
int a ;
聲明一個(gè)外部變量
extern int a ;
內(nèi)部變量:定義的變量只能被本文件訪問,不能被其他文件訪問
- 不同文件中的同名內(nèi)部變量,互不影響
定義一個(gè)內(nèi)部變量
static int a ;
static 對(duì)變量的作用:定義一個(gè)內(nèi)部變量
extern 對(duì)變量的作用:聲明一個(gè)外部變量
static對(duì)函數(shù)的作用:定義和聲明一個(gè)內(nèi)部函數(shù)
extern對(duì)函數(shù)的作用:定義和聲明一個(gè)外部函數(shù)(可以省略不寫)
const的用法 ? 作用是什么 ?
1.用法: 被用來修飾基本數(shù)據(jù)類型或指針
2.作用:被修飾的類型訪問權(quán)限會(huì)變?yōu)橹蛔x
修飾基本數(shù)據(jù)類型時(shí),基本數(shù)據(jù)類型只能被賦值一次
int const a = 1;
const int b = 2;
a = 3; //Xcode提示錯(cuò)誤,無法修改a的值
b = 3; //Xcode提示錯(cuò)誤,無法修改b的值
const在指針符號(hào)(*)的左邊: *p指向的內(nèi)存中的值為只讀(int const *p和const int *p效果一致)
int a = 1;
int b = 2;
int const *p = &a; //*p訪問的是a變量的值
*p = 30; //Xcode提示錯(cuò)誤,無法修改
p = &b;
const在指針符號(hào)(*)的右邊 : p指針中保存的內(nèi)存地址為只讀
int a = 1;
int b = 2;
int *const p = &a;
*p = 30;
p = &b; //Xcode提示錯(cuò)誤,無法修改
*const同時(shí)在指針符號(hào)()兩邊 : 指針指向的地址不可以改變,同時(shí)無法改變指向地址所保存的值。
int a = 1;
int b = 2;
int const * const p = &a;
*p = 30; //Xcode提示錯(cuò)誤,無法修改
p = &b; //Xcode提示錯(cuò)誤,無法修改
補(bǔ)充:static可以多次賦值,但最好不要那么做,負(fù)責(zé)會(huì)失去靜態(tài)變量的意義
@private、@protected、@public、@package
@private 私有的
代表私有,也就是只有自己有,別人誰都不可用,不不可以繼承的。
@protected 受保護(hù)的
相較上邊的private而言,就沒有那么自私了,他自己可以用,自己的子類也是可以共享的,是可以繼承的.
@public 公共的
相較上邊而言,誰都可以用,只要你有這個(gè)類的對(duì)象,就可以拿到public下的變量,
@package 包
這個(gè)主要是用于框架類,使用@private太限制,使用@protected或者@public又太開放,就使用這個(gè)package吧。