OC中的屬性Property和點(diǎn)語法

OC中的屬性Property和點(diǎn)語法

屬性是什么

我們都知道,屬性是變量和它對(duì)應(yīng)的setter和getter方法的集合瘩将,是一種語法糖凯傲,是一種簡(jiǎn)化的寫法。也就是說磕诊,當(dāng)你聲明了一個(gè)屬性的時(shí)候填物,你同時(shí)聲明了一個(gè)變量,一個(gè)setter方法霎终,一個(gè)getter方法滞磺。

@property NSObject *property;

等價(jià)于

NSObject *_property;

- (void)setProperty:(NSObject *)property {
    _property = property;
}

- (NSObject *)property {
    return _property;
}

這次我們就來了解一下OC中屬性的一些特性。

對(duì)比Swift中的屬性類型

在Swift中莱褒,屬性是有很多類型的击困,有存儲(chǔ)屬性、計(jì)算屬性广凸、延遲屬性阅茶、可選屬性、類屬性等谅海。
Swift是以O(shè)C為基礎(chǔ)而設(shè)計(jì)的全新語言目派,它雖然有著全新的更全面的語法特性,但是依然能看出OC的影子胁赢。相反的企蹭,我們可以從Swift的對(duì)比中分析OC的一些特性白筹。

存儲(chǔ)屬性

現(xiàn)在,我們聲明一個(gè)字符串屬性:

@property NSString *str;

這其實(shí)就是一個(gè)存儲(chǔ)屬性谅摄,因?yàn)樗闪艘粋€(gè)變量用來存放字符串?dāng)?shù)據(jù)徒河。

計(jì)算屬性

那計(jì)算屬性又是什么呢?

計(jì)算屬性不直接存儲(chǔ)值送漠,而是提供一個(gè) getter 來獲取值顽照,一個(gè)可選的 setter 來間接設(shè)置其他屬性或變量的值。

根據(jù)上面的描述得出:就是沒有生成變量闽寡,只有setter/getter方法的屬性就是計(jì)算屬性代兵。其實(shí)在很早之前,定義屬性的時(shí)候是不會(huì)生成變量的爷狈,需要使用 @synthesize str = _str; 這樣的方式來生成變量植影,同時(shí)定義變量的名稱。但在后來涎永,Apple默認(rèn)會(huì)生成變量思币。

那么在OC中,如何創(chuàng)建一個(gè)計(jì)算屬性呢羡微?
在OC中谷饿,有這樣一條規(guī)則,如果聲明的屬性同時(shí)重寫了setter方法和getter方法妈倔,需要使用 @synthesize 重新聲明變量博投。也就是說,如果不聲明變量盯蝴,他就是一個(gè)有著setter/getter方法的計(jì)算屬性毅哗。

那么如果只需要實(shí)現(xiàn)setter/getter方法中的其中一個(gè)的計(jì)算屬性怎么辦呢?這里就到了@dynamic關(guān)鍵字登場(chǎng)了结洼。
被@dynamic`修飾的屬性在OC中被稱為動(dòng)態(tài)屬性黎做。顧名思義,就是用于動(dòng)態(tài)計(jì)算的屬性松忍。

@synthesize@dynamic都是定義在 @implementation下面的蒸殿。

延遲屬性

Swift中的延遲屬性,在OC中的表現(xiàn)形式就是懶加載鸣峭。

- (NSMutableArray *)dataSource {
    if (!_dataSource) {
        _dataSource = [[NSMutableArray alloc] init];
    }
    return _dataSource;
}

這是一個(gè)典型的懶加載模式宏所,是通過重寫getter方法來動(dòng)態(tài)的初始化變量,但是這樣的寫法并不完全滿足延遲屬性摊溶,因?yàn)樵摲椒ㄒ呀?jīng)無法獲取到nil這個(gè)值了爬骤。

可選屬性

在Swift中,每個(gè)對(duì)象初始化的時(shí)候莫换,所有的存儲(chǔ)屬性必須得到初始化霞玄,為了簡(jiǎn)化類的初始化骤铃,所以增添了可選型Optional】谰纾可選屬性默認(rèn)值為nil惰爬。在OC中,所有定義的屬性并沒有強(qiáng)制初始化惫企,所以都為可選屬性撕瞧。

類屬性

類屬性,顧名思義就是類自身的屬性狞尔,他不屬于對(duì)象丛版,而是屬于類本身。通過class修飾符實(shí)現(xiàn)偏序。

@property (class, readonly, strong) NSUserDefaults *standardUserDefaults;
@property (class, readonly, strong) NSFileManager *defaultManager;
@property (class, readonly, strong) NSNotificationCenter *defaultCenter;

#if UIKIT_DEFINE_AS_PROPERTIES
@property(class, nonatomic, readonly) UIPasteboard *generalPasteboard;
#else
+ (UIPasteboard *)generalPasteboard;
#endif

如今iOS框架中的單例方法都從一個(gè)單例方法逐步變成了現(xiàn)在的類屬性的方式页畦。

定義的類屬性需要使用@dynamic修飾

點(diǎn)語法

點(diǎn)語法是跟隨屬性的應(yīng)用而生的,是為了更加簡(jiǎn)單方便的訪問屬性而出的語法特性禽车。而他本質(zhì)上其實(shí)是一個(gè)動(dòng)態(tài)方法寇漫,它無關(guān)乎是否是屬性刊殉,它只是轉(zhuǎn)換成對(duì)應(yīng)setter/getter方法格式的參數(shù)來調(diào)用方法而已殉摔。

如下兩個(gè)方法也可以使用點(diǎn)語法來調(diào)用,就是這個(gè)道理记焊。

- (id)copy;
- (id)mutableCopy;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逸月,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子遍膜,更是在濱河造成了極大的恐慌碗硬,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓢颅,死亡現(xiàn)場(chǎng)離奇詭異恩尾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)挽懦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門翰意,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人信柿,你說我怎么就攤上這事冀偶。” “怎么了渔嚷?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵进鸠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我形病,道長(zhǎng)客年,這世上最難降的妖魔是什么霞幅? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮量瓜,結(jié)果婚禮上蝗岖,老公的妹妹穿的比我還像新娘。我一直安慰自己榔至,他們只是感情好抵赢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著唧取,像睡著了一般铅鲤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枫弟,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天邢享,我揣著相機(jī)與錄音,去河邊找鬼淡诗。 笑死骇塘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的韩容。 我是一名探鬼主播款违,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼群凶!你這毒婦竟也來了插爹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤请梢,失蹤者是張志新(化名)和其女友劉穎赠尾,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毅弧,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡气嫁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了够坐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寸宵。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖咆霜,靈堂內(nèi)的尸體忽然破棺而出邓馒,到底是詐尸還是另有隱情,我是刑警寧澤蛾坯,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布光酣,位于F島的核電站,受9級(jí)特大地震影響脉课,放射性物質(zhì)發(fā)生泄漏救军。R本人自食惡果不足惜财异,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望唱遭。 院中可真熱鬧戳寸,春花似錦、人聲如沸拷泽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽司致。三九已至拆吆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脂矫,已是汗流浹背枣耀。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庭再,地道東北人捞奕。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拄轻,于是被迫代替她去往敵國(guó)和親颅围。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348