OC常量纯蛾、變量、屬性及其特性

1.Objective-C中聲明常量使用關(guān)鍵字const纵隔。如:const double PI = 3.1514;

2.Objective-C中變量可以分為成員變量翻诉、局部變量和全局變量(用的很少炮姨,盡量不要用)。

//————————------------常量—————————————————//

方法一:#define kDetailKey? ? ? ? ? ? @“detail text”

#define DOWNLOAD_TIMEOUT? ? ? 60.0

#define degresssToRadian(x)? (M_PT*(X)/180.0)

這種方法直接使用#define定義函數(shù)碰煌、字符串和數(shù)字舒岸,和普通的C/C++一樣,唯一的區(qū)別是字符串需要在前面加上“@”符號(hào)芦圾。

方法二:

typedef enum{kTagLanguageView = 100,

kTagSeriesView,

kTagSeriesDetailView,

kTagThumbView,

kTagVideoView,

kTagFullPhotoView,

}TagSystemViews;

使用枚舉定義常量蛾派,在這里kTagSeriesView等于101,在程序中直接使用kTagSeriesView來表示這個(gè)常量,這和C/C++一樣个少。

方法三:

在.m或者.mm文件中使用靜態(tài)常量聲明洪乍,和C/C++使用方法一樣,

例如:

static NSString *BlockColorAlphaComponentKey =@"blockColorAlphaComponent”;

//————————------------變量—————————————————//

1.為了強(qiáng)制一個(gè)對(duì)象隱藏其數(shù)據(jù)稍算,編譯器限制實(shí)例變量范圍以限制其在程序中的可見性典尾。

但是為了提供靈活性,蘋果也讓開發(fā)者顯示設(shè)置范圍(四選一)糊探。

2.四種編譯指令如下:@private實(shí)例變量只能被聲明它的類訪問钾埂。

@protected

實(shí)例變量能被聲明它的類和子類,所有沒有顯示指定范圍的實(shí)例變量都是@protected科平。

@public

實(shí)例變量可以在任何地方被訪問褥紫。

@packge

使用modern運(yùn)行時(shí),一個(gè)@package實(shí)例變量在實(shí)現(xiàn)這個(gè)類的可執(zhí)行文件鏡像中實(shí)際上是@public的瞪慧,但是在外面就是@private髓考。

OC中的@package與C語言中的變量和函數(shù)的private_extern類似。任何在實(shí)現(xiàn)類的鏡像之外想使用這個(gè)實(shí)例變量都會(huì)引發(fā)link error弃酌。

這個(gè)類型最常用于框架類的實(shí)例變量氨菇,使用@private太限制,使用@protected或者@public又太開放妓湘。

//——————————————屬性—————————————————//

屬性:@property:

@property只不過是給編譯器看的一種指令查蓉,它可以編譯之后自動(dòng)為你生成相應(yīng)的getter和setter方法。

1.公共屬性表示你打算如何使用這一類的對(duì)象榜贴。

2.屬性聲明是一個(gè)指令豌研,它告訴編譯器如何為變量生成存取方法。(添加屬性聲明后唬党,你將了解到有關(guān)存取方法的信息)

3.id類型是一個(gè)通用類型鹃共,OC使用id表示任意類型的對(duì)象,它可以作為一個(gè)占位符表示這是一個(gè)不確定的類型的對(duì)象或者引用驶拱。因此霜浴,所有的對(duì)象都可以用id來表示。

4.編譯器指令@property可以為一個(gè)類聲明屬性蓝纲,這是一個(gè)偷懶的好方法坷随,用@property聲明屬性相當(dāng)于同時(shí)聲明并實(shí)現(xiàn)了對(duì)應(yīng)的實(shí)例變量的訪問器方法房铭。當(dāng)然,也可以通過指定屬性的特性(Attribute)類控制自動(dòng)生成的訪問器方法的行為温眉。

5.OC里的實(shí)例變量默認(rèn)都是私有的缸匪。私有變量只在類自身和子類的實(shí)例方法里可見。

6.iOS OC聲明變量在@interface括號(hào)中和使用@proper的區(qū)別:

方式一:直接在@interface中的大括號(hào)中聲明类溢。

@interface MyTest:

NSObject{NSString *mystr凌蔬;

}

方式二:直接用@property聲明

@interface MyTest:

NSObject@property(strong,nonatomic)NSString *mystr;

隨后在.m文件中@synthesize mystr = _myStr;(也可以在.m文件中不加@synthesize)區(qū)別:

方式一聲明的成員變量是只能在自己類內(nèi)部使用闯冷,而不能在類的外部使用(就是通過類名.點(diǎn)的方式顯示不出來砂心。)。

方式二可以在類的外部訪問蛇耀,也可以在類的內(nèi)部通過下劃線+變量名或者self.變量名的方式訪問辩诞。蘋果開發(fā)模板推薦的是方式二。


7.OC是C的嚴(yán)格父集纺涤,C能做的事情OC中都能做译暂。屬性實(shí)際上一個(gè)setter方法和一個(gè)getter方法,所有對(duì)實(shí)例變量的訪問都是如此撩炊,通過setter方法設(shè)置值外永,通過 getter方法獲取值你沒有必要去優(yōu)化沒有必要優(yōu)化的東西,你要優(yōu)化的是很花時(shí)間的東西拧咳,而訪問實(shí)例變量不會(huì)花太多時(shí)間伯顶。

8..h是共有的API.m是私有的API以及你所有的實(shí)現(xiàn)。所有指針要么是強(qiáng)的骆膝,要么是弱的祭衩,因?yàn)镺C需要知道怎樣處理內(nèi)存和堆。強(qiáng)表示保持這個(gè)的存儲(chǔ)阅签,在堆中掐暮,保持這個(gè)所指的東西.

9.plist:屬性配置文件,基于XML格式愉择,也扮演了一部分定義UI的角色劫乱,Xcode在編譯的時(shí)候會(huì)讀取里面的配置信息织中。

10.類的聲明提供了這個(gè)類和程序員之間的接口锥涕,類的聲明即接口,其實(shí)現(xiàn)代碼才是真正執(zhí)行實(shí)際任務(wù)的地方狭吼。類的聲明以@interface指令開始层坠,以@end指令結(jié)束。

11.藍(lán)色的豎線:它是UI控件和屏幕邊框的距離參考線以及對(duì)齊參考線刁笙,用于設(shè)置控件在不同大小的屏幕上的位置破花。

12.屬性使用點(diǎn)語法谦趣,其他情況使用方括號(hào)標(biāo)記語法。***********************************

copy:

1.簡單復(fù)制只能實(shí)現(xiàn)淺拷貝:指針賦值座每,使每個(gè)指針指向相同的一塊內(nèi)存空間前鹅,操作不安全。

2.在iOS中可以這樣實(shí)現(xiàn):Foundation類已經(jīng)遵守了和協(xié)議峭梳,即實(shí)現(xiàn)了copy和mutableCopy方法舰绘,因此Foundation對(duì)象可以使用這些方法創(chuàng)建對(duì)象的副本或可變副本。

**************************

為屬性聲明自定義特性

1.訪問器方法

a葱椭。我們通過@synthesize這個(gè)標(biāo)記來為屬性生成訪問器方法捂寿。

b。默認(rèn)情況下孵运,如果我們聲明的屬性名為propertyName秦陋,那么編譯器自動(dòng)生成的訪問器方法分別為propertyName:和setPropertyName:。

c治笨〔蹈牛可以通過“getter=getterName”和“setter=setterName”這兩個(gè)屬性的自定義特性來設(shè)置訪問器方法的名稱。

d大磺。自定義訪問器方法的名稱會(huì)導(dǎo)致“點(diǎn)句式”語法糖不好使抡句。

2.可寫性

如果給屬性加上readonly的特性:編譯器不會(huì)自動(dòng)生成setter訪問器方法,屬性也就變成只讀的杠愧。

3.setter支持的特性

a待榔。setter方法不僅僅是簡單的賦值,有這么幾個(gè)修飾詞是用來描述setter方法的:assign流济,retain锐锣,copy和weak,用不同的修飾詞表示生成的setter方法會(huì)有所不同绳瘟。

b雕憔。默認(rèn)是assign,這意味著在setter方法中真的就是簡單的賦值糖声。

c斤彼。retain:表示賦值之后會(huì)調(diào)用新值的retain方法和舊值的release方法。

d蘸泻。copy:表示先將值拷貝一份琉苇,然后將這個(gè)拷貝賦給實(shí)例變量,這個(gè)修飾詞只適用于實(shí)現(xiàn)了NSCopying協(xié)議的類型悦施。

e并扇。weak:表示這個(gè)值將是一個(gè)弱引用,引用和被引用之間沒有所屬關(guān)系抡诞。如果系統(tǒng)銷毀了某個(gè)屬性所引用的對(duì)象穷蛹,屬性的值會(huì)自動(dòng)地變?yōu)閚il土陪。一般情況下,如果父對(duì)象擁有子對(duì)象的引用肴熏,那么子對(duì)象就不應(yīng)該再持有父對(duì)象的強(qiáng)引用鬼雀,而是使用弱引用的方式來引用父對(duì)象。

f蛙吏。strong:表示這個(gè)值是一個(gè)強(qiáng)引用取刃,引用和被引用之間具有所屬關(guān)系。從內(nèi)存使用的角度來看出刷,就是引用對(duì)象被回收之前璧疗,被引用的對(duì)象不會(huì)被回收。

4.原子化和非原子化:atomi和nonatomic用來決定編譯器生成的getter和setter是否為原子操作馁龟。

a崩侠。nonatomic指定訪問器方式是非線程安全的,即多個(gè)線程可以同時(shí)訪問這個(gè)屬性坷檩。

b却音。默認(rèn)情況下,訪問器方法都是 線程安全的矢炼,即使在多線程環(huán)境中也毫無風(fēng)險(xiǎn)的系瓢。然而,即使要保證在多線程環(huán)境中能正常工作句灌,訪問器也不一定必須是線程安全的夷陋。而將訪問器方法指定為非線程安全的,可以讓getter方法直接返回實(shí)例變量的值胰锌,效率更高骗绕。

********************

合成(Synthesizing)屬性

1.聲明一個(gè)屬性之后編譯器會(huì)自動(dòng)將相關(guān)的代碼補(bǔ)充完整,即編譯器會(huì)自動(dòng)聲明一個(gè)實(shí)例變量以及相關(guān)的訪問器方法资昧,實(shí)例變量的名稱是屬性名稱前面加上下劃線酬土。

2.不過有時(shí)候我們需要自己來指定實(shí)例變量的名稱,這時(shí)候就需要用到@synthesize指令了格带。

3.

a撤缴。如果你不得不手動(dòng)指定屬性對(duì)應(yīng)的實(shí)例變量的名稱,請(qǐng)?jiān)贎implementation指令之后使用@synthesize指令做如下聲明:

@synthesize label;

這行代碼要求編譯器根據(jù)接口中聲明的屬性來自動(dòng)生成訪問器方法叽唱。

b屈呕。也可以使用如下的方式來指明訪問器方法使用的實(shí)例變量的名稱:

@synthesize label = _label;

這里指明了實(shí)例變量名為_label,而且這是一種很好的封裝實(shí)例變量的方法尔觉,讓所有對(duì)該實(shí)例變量的訪問都通過訪問器方法來執(zhí)行凉袱。同時(shí)芥吟,這種方法也可以避免編譯器自動(dòng)取名字時(shí)和已用的實(shí)例變量名稱沖突的情況侦铜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末专甩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钉稍,更是在濱河造成了極大的恐慌涤躲,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贡未,死亡現(xiàn)場離奇詭異种樱,居然都是意外死亡浆竭,警方通過查閱死者的電腦和手機(jī)羹蚣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門渗常,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偏竟,“玉大人诚亚,你說我怎么就攤上這事更胖∈匚剩” “怎么了车伞?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵狠怨,是天一觀的道長约啊。 經(jīng)常有香客問我,道長佣赖,這世上最難降的妖魔是什么恰矩? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮憎蛤,結(jié)果婚禮上外傅,老公的妹妹穿的比我還像新娘。我一直安慰自己俩檬,他們只是感情好栏豺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著豆胸,像睡著了一般奥洼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晚胡,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天灵奖,我揣著相機(jī)與錄音,去河邊找鬼估盘。 笑死瓷患,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遣妥。 我是一名探鬼主播擅编,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了爱态?” 一聲冷哼從身側(cè)響起谭贪,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锦担,沒想到半個(gè)月后俭识,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洞渔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年套媚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磁椒。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡堤瘤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浆熔,到底是詐尸還是另有隱情宙橱,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布蘸拔,位于F島的核電站师郑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏调窍。R本人自食惡果不足惜宝冕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望邓萨。 院中可真熱鬧地梨,春花似錦、人聲如沸缔恳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽歉甚。三九已至万细,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纸泄,已是汗流浹背赖钞。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留聘裁,地道東北人雪营。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像衡便,于是被迫代替她去往敵國和親献起。 傳聞我的和親對(duì)象是個(gè)殘疾皇子洋访,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容