iOS 關(guān)鍵字

常用關(guān)鍵字理解

strong、copy、weakassign

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可以

nonatomicatomic
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)重載的屬性

externstatic的區(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吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容