關(guān)鍵字&&屬性

#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)存中釋放。

strongretain功能相似;

weak

弱引用,不決定對(duì)象的存亡。即使一個(gè)對(duì)象被持有無(wú)數(shù)個(gè)弱引用,只要沒(méi)有強(qiáng)引用指向它,那么還是會(huì)被清除。?

weakassign相似,只是當(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)前類或者他的子類

參考文檔:

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocDefiningClasses.html#//apple_ref/doc/uid/TP30001163-CH12-SW1

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

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

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