#import
導(dǎo)入接口,確保同一個(gè)文件永遠(yuǎn)不會(huì)被包含多次;比#include的好處就是不會(huì)引起重復(fù)包含(交叉編譯)
#include
導(dǎo)入接口
@class
一般用于頭文件中需要聲明該類的某個(gè)實(shí)例變量的時(shí)候用到。
@interface
類接口的聲明以編譯器指令開(kāi)頭 @interface 并以 指令結(jié)束 @en??d。
@property
聲明屬性
+ ? ??-?
+ 類對(duì)象,類方法可以使用的方法的名稱,前面加 一個(gè)加號(hào) +
- ?類實(shí)例可以使用的方法,實(shí)例方法,標(biāo)有減號(hào) -
@implementation
類接口的實(shí)現(xiàn)
@synthesize
如果不在@implementation塊中提供屬性,則使用 該指令告訴編譯器它應(yīng)該為屬性合成setter和/或 getter方法。@sy??thesize如果沒(méi)有聲明,該指令 還會(huì)合成一個(gè)適當(dāng)?shù)膶?shí)例變量。 無(wú)論是否指定實(shí)例變量的名稱,該@sy??thesize指 令只能使用當(dāng)前類的實(shí)例變量,而不能使用超 類。
@dynamic
使用@dynamic關(guān)鍵字告訴編譯器您將通過(guò)直接提 供方法實(shí)現(xiàn)或在運(yùn)行時(shí)使用其他機(jī)制(如動(dòng)態(tài)加 載代碼或動(dòng)態(tài)方法解析)來(lái)實(shí)現(xiàn)屬性隱含的API契 約。它會(huì)抑制編譯器在無(wú)法找到合適的實(shí)現(xiàn)時(shí)會(huì) 產(chǎn)生的警告。只有在知道方法在運(yùn)行時(shí)可用時(shí)才 應(yīng)使用它。
要點(diǎn):如果未指定@sy??thesize或@dynamic為特定屬性 指定,則必須為該屬性提供getter和setter(或者 只是readonly屬性的getter )方法實(shí)現(xiàn)。如果不這 樣做,編譯器會(huì)生成警告。
@private
實(shí)例變量 只能在聲明它的類中訪問(wèn)。
@protected
實(shí)例變量可以在聲明它的類中以及繼承它的類中 訪問(wèn)。沒(méi)有顯式范圍指令的所有實(shí)例變量都有 @protected范圍。
@public
實(shí)例變量隨處可訪問(wèn)。
@package
實(shí)例變量可以在包內(nèi)部訪問(wèn),一個(gè)項(xiàng)目一定是在同一個(gè)包下。
@protocol
協(xié)議名
@required
必須實(shí)現(xiàn)的協(xié)議方法(默認(rèn))
@optional
將協(xié)議方法標(biāo)記為可選
屬性
訪問(wèn)者方法名稱
getter=getterName
指定屬性的get訪問(wèn)器的名稱。getter必須返回與 屬性類型匹配的類型,并且不帶參數(shù)。
setter=setterName
指定屬性的set訪問(wèn)器的名稱。setter方法必須采用 與屬性類型匹配的類型的單個(gè)參數(shù),并且必須返 回v??id。如果指定屬性read??????y并且還指定了setter setter=,則會(huì)收到編譯器警告。 通常,您應(yīng)指定符合鍵值編碼的訪問(wèn)者方法名稱 (請(qǐng)參閱鍵值編碼編程指南) - 使用getter裝飾器 的常見(jiàn)原因是遵守布爾值的isPr????ertyNa??e約定。
可寫(xiě)
readwrite
指示應(yīng)將該屬性視為讀/寫(xiě)。此屬性是默認(rèn)值。 @implementation????塊中需要getter和setter方法。 如果@sy??thesize在實(shí)現(xiàn)塊中使用該指令,則會(huì)合 成getter和setter方法。
此屬性是默認(rèn)值,?會(huì)自動(dòng)為你生成存取器。
readonly
表示該屬性是只讀的。?如果指定readonly,則@implementation????塊中只需 要getter方法。如果@sy??thesize在實(shí)現(xiàn)塊中使用 該指令,則僅合成getter方法。此外,如果您嘗試 使用點(diǎn)語(yǔ)法分配值,則會(huì)出現(xiàn)編譯器錯(cuò)誤。
只生成getter不會(huì)有setter方法。
set的語(yǔ)義學(xué)
strong
強(qiáng)引用,也是我們通常說(shuō)的引用,其存亡直接決定了所指向?qū)ο蟮拇嫱?。如果不存在指向一個(gè)對(duì)象的引用,并且此對(duì)象不再顯示在列表中,則此對(duì)象會(huì)被從內(nèi)存中釋放。
strong與retain功能相似;
weak
弱引用,不決定對(duì)象的存亡。即使一個(gè)對(duì)象被持有無(wú)數(shù)個(gè)弱引用,只要沒(méi)有強(qiáng)引用指向它,那么還是會(huì)被清除。?
weak與assign相似,只是當(dāng)對(duì)象消失后weak會(huì)自動(dòng)把指針變?yōu)閚il;
(OS X v10.6和iOS 4不支持弱屬性;請(qǐng)assig??改 用。)
assign
默認(rèn)類型,setter方法直接賦值,不進(jìn)行任何retain操作,不改變引用計(jì)數(shù)。一般用來(lái)處理基本數(shù)據(jù)類型。例如NSI??teger和 CGRect。
retain
釋放舊的對(duì)象(release),將舊對(duì)象的值賦給新對(duì)象,再令新對(duì)象引用計(jì)數(shù)為1。
指定retai??n在賦值時(shí)應(yīng)在對(duì)象上調(diào)用。 先前的值會(huì)發(fā)送一條re??ease消息。
在OS X v10.6及更高版本中,您可以使用該 __attribute__關(guān)鍵字指定應(yīng)將Co??re F??oun??dation????屬性 視為用于內(nèi)存管理的Objective-C對(duì)象:?
@??prop????erty(retai??n??)__ attribute __ ((NSObject))CFDicti????onaryRef ??myDicti????onary;
copy
與retain處理流程一樣,先對(duì)舊值release,再copy出新的對(duì)象,retainCount為1.為了減少對(duì)上下文的依賴而引入的機(jī)制。我理解為內(nèi)容的拷貝,向內(nèi)存申請(qǐng)一塊空間,把原來(lái)的對(duì)象內(nèi)容賦給它,令其引用計(jì)數(shù)為1。對(duì)copy屬性要特別注意:被定義有copy屬性的對(duì)象必須要符合NSCopying協(xié)議,必須實(shí)現(xiàn)- (id)copyWithZone:(NSZone *)zone方法
原子性
nonatomic
指定訪問(wèn)者是非原子的。默認(rèn)情況下,訪問(wèn)器是原子的。
-----------------------------------------
如果該對(duì)象無(wú)需考慮多線程的情況,請(qǐng)加入這個(gè)屬性,這樣會(huì)讓編譯器少生成一些互斥加鎖代碼,可以提高效率。
當(dāng)一個(gè)變量聲明為nonatomic時(shí),意味著多個(gè)線程可以同時(shí)對(duì)其進(jìn)行訪問(wèn);它是非線程安全型,訪問(wèn)速度快;當(dāng)兩個(gè)不同的線程對(duì)其訪問(wèn)時(shí),容易失控。
atomic
默認(rèn)情況下,屬性是合成訪問(wèn)器提供對(duì)多線程環(huán)境中屬性的強(qiáng)大訪問(wèn) - 也就是說(shuō),無(wú)論其他線程 同時(shí)執(zhí)行什么,始終完全檢索或設(shè)置從getter返回 的值或通過(guò)setter設(shè)置的值。如果指定strong,?copy或者retain??未指定nonatomic,則在引用計(jì)數(shù)環(huán)境中, 對(duì)象屬性的合成get訪問(wèn)器使用鎖并保留并自動(dòng)釋放返回的值
- 實(shí)現(xiàn)將類似于以下內(nèi)容:
[_內(nèi)鎖]; //使用對(duì)象級(jí)鎖定鎖定
id resu??t = [[retai?? retain??] aut??re??ease];
[_內(nèi)部解鎖];
返回結(jié)果; 如果指定??????atomic,則對(duì)象屬性的合成訪問(wèn)器只是直接返回值。
-----------------------------------------
這個(gè)屬性是為了保證程序在多線程情況,編譯器會(huì)自動(dòng)生成一些互斥加鎖代碼,避免該變量的讀寫(xiě)不同步問(wèn)題。
當(dāng)一個(gè)變量聲明為atomic時(shí),意味著在多線程中只能有一個(gè)線程能對(duì)它進(jìn)行訪問(wèn);該變量為線程安全型,但是會(huì)影響訪問(wèn)速度;在非ARC編譯環(huán)境下,需要設(shè)置訪問(wèn)鎖來(lái)保證對(duì)該變量進(jìn)行正確的get/set加了atomic,setter函數(shù)會(huì)變成下面這樣:
if (property != newValue) {
?? ?[property release]; ?
? ? property = [newValue retain];??
}
@encode
@encode為編譯器宏,它可以將類型轉(zhuǎn)換為響應(yīng) 的字符串。
id
可以調(diào)用任何對(duì)象方法,不能進(jìn)行編譯檢測(cè)(運(yùn) 行時(shí)容易找不到方法)。 id是指向 Objective-C類對(duì)象的指針,它可以聲明為任何類 對(duì)象的指針,當(dāng)在Objective-C中應(yīng)用id時(shí),編譯 器會(huì)假定你知道,id指向哪個(gè)類的對(duì)象。與vo??id是不同的是,vo??id編譯器不知道也不假定指向任何類型的指針。
nil???
定義為一個(gè)常量,若是一個(gè)指針的值為??nil??,代表這個(gè)指針沒(méi)有指向任何對(duì)象。
self
在Objective-C中,關(guān)鍵字se??f與c++中this是同一 概念,就是類對(duì)象自身的地址,經(jīng)由過(guò)程self可以 調(diào)用本身的實(shí)例變量和辦法
Super
當(dāng)子類須要調(diào)用父類的辦法時(shí),會(huì)用到Super關(guān)鍵 字. Super指向的是父類的指針,子類重寫(xiě)父類的 辦法時(shí),調(diào)用父類的辦法是一個(gè)非常好的習(xí)慣。 因?yàn)楫?dāng)我們不知道父類在該辦法中實(shí)現(xiàn)的功能 時(shí),若是不調(diào)用父類的辦法,有可能我們重寫(xiě)的 辦法會(huì)落空該功能,這是我們不想看到的景象。
NSNull
NSNull是沒(méi)有的意思,若是一個(gè)字典的值為 NSNull????,那申明與該值對(duì)應(yīng)的Key是沒(méi)有值的,例 如Key為address,聲明與address對(duì)應(yīng)的是值是沒(méi)有。
instancetype
自動(dòng)識(shí)別當(dāng)前類的對(duì)象 x??code 5
__kindof
表示相當(dāng)于當(dāng)前類或者他的子類
參考文檔: