運(yùn)行時(shí)添加BOOL屬性酬屉,及懶加載BOOL屬性。

關(guān)于類目(分類)能不能或者說應(yīng)不應(yīng)該添加屬性揍愁,本文不做討論呐萨。只是介紹利如何用運(yùn)行時(shí)為類添加屬性。

/** 
 * Sets an associated value for a given object using a given key and association policy.
 * 
 * @param object The source object for the association.
 * @param key The key for the association.
 * @param value The value to associate with the key key for object. Pass nil to clear an existing association.
 * @param policy The policy for the association. For possible values, see “Associative Object Behaviors.”
 * 
 * @see objc_setAssociatedObject
 * @see objc_removeAssociatedObjects
 */
OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
    OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0);

/** 
 * Returns the value associated with a given object for a given key.
 * 
 * @param object The source object for the association.
 * @param key The key for the association.
 * 
 * @return The value associated with the key \e key for \e object.
 * 
 * @see objc_setAssociatedObject
 */
OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key)
    OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0);

/** 
 * Removes all associations for a given object.
 * 
 * @param object An object that maintains associated objects.
 * 
 * @note The main purpose of this function is to make it easy to return an object 
 *  to a "pristine state”. You should not use this function for general removal of
 *  associations from objects, since it also removes associations that other clients
 *  may have added to the object. Typically you should use \c objc_setAssociatedObject 
 *  with a nil value to clear an association.
 * 
 * @see objc_setAssociatedObject
 * @see objc_getAssociatedObject
 */
OBJC_EXPORT void objc_removeAssociatedObjects(id object)
    OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0);

以上三個(gè)為<objc/runtime.h>里提供的在運(yùn)行時(shí)處理屬性的方法吗垮。
·第一個(gè)是添加關(guān)聯(lián)策略
·第二個(gè)是獲取關(guān)聯(lián)策略
·第三個(gè)是移除所有關(guān)聯(lián)策略(慎用6饴稹!K傅恰)
·如果需要移除某個(gè)關(guān)聯(lián)策略怯屉,那么可以使用第一個(gè)方法蔚舀,傳入?yún)?shù)為nil即可。

網(wǎng)上已經(jīng)有大量的相關(guān)的方法锨络。但是大多是對(duì)象類型赌躺,缺少基本數(shù)據(jù)類型的添加。
下面就是以BOOL類型為例子羡儿,進(jìn)行相關(guān)的處理礼患。

const void *theKey = @"theKey";
- (void)setYourProperty:(BOOL)yourPropertyName {
    objc_setAssociatedObject(self, theKey, @(isXXX), OBJC_ASSOCIATION_ASSIGN);
}

- (BOOL)yourProperty {
    return [objc_getAssociatedObject(self, theKey) boolValue];
}

上面是利用運(yùn)行時(shí)方法為某個(gè)類添加一個(gè)BOOL類型的屬性。下面介紹常規(guī)的BOOL屬性賦初值的方法掠归。利用懶加載給一個(gè)BOOL屬性賦一個(gè)初值缅叠。(ARC環(huán)境)

初值為NO的情況:

- (BOOL)isXXX {
    if (!_isXXX) {
        _isXXX = NO;
    }
    return _isXXX;
}

初值為YES的情況:
因?yàn)椴紶枌傩栽跊]有初值的情況下值并不明確,類似于NO的情況虏冻,那么可以利用dispatch_once_t函數(shù)進(jìn)行處理肤粱。雖然官方API里面解釋的是"Use lazily initialized globals instead",但是布爾類型基本數(shù)據(jù)類型厨相,使用的是assign來修飾领曼。不會(huì)產(chǎn)生內(nèi)存問題。

- (BOOL)isXXX {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _isXXX = YES;
    });
    return _isXXX;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛮穿,一起剝皮案震驚了整個(gè)濱河市庶骄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌践磅,老刑警劉巖单刁,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異府适,居然都是意外死亡幻碱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門细溅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褥傍,“玉大人,你說我怎么就攤上這事喇聊』蟹纾” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵誓篱,是天一觀的道長(zhǎng)朋贬。 經(jīng)常有香客問我,道長(zhǎng)窜骄,這世上最難降的妖魔是什么锦募? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮邻遏,結(jié)果婚禮上糠亩,老公的妹妹穿的比我還像新娘虐骑。我一直安慰自己,他們只是感情好赎线,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布廷没。 她就那樣靜靜地躺著,像睡著了一般垂寥。 火紅的嫁衣襯著肌膚如雪颠黎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天滞项,我揣著相機(jī)與錄音狭归,去河邊找鬼。 笑死文判,一個(gè)胖子當(dāng)著我的面吹牛唉铜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播律杠,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼竞惋!你這毒婦竟也來了柜去?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤拆宛,失蹤者是張志新(化名)和其女友劉穎嗓奢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浑厚,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡股耽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钳幅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片物蝙。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖敢艰,靈堂內(nèi)的尸體忽然破棺而出诬乞,到底是詐尸還是另有隱情,我是刑警寧澤钠导,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布震嫉,位于F島的核電站,受9級(jí)特大地震影響牡属,放射性物質(zhì)發(fā)生泄漏票堵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一逮栅、第九天 我趴在偏房一處隱蔽的房頂上張望悴势。 院中可真熱鬧窗宇,春花似錦、人聲如沸瞳浦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叫潦。三九已至蝇完,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矗蕊,已是汗流浹背短蜕。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留傻咖,地道東北人朋魔。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像卿操,于是被迫代替她去往敵國(guó)和親警检。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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