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í)例變量名稱沖突的情況侦铜。