溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

object_C 關(guān)聯(lián)一個對象

發(fā)布時間:2020-07-04 03:31:11 來源:網(wǎng)絡(luò) 閱讀:313 作者:wong_girl 欄目:開發(fā)技術(shù)

   關(guān)聯(lián)是指把兩個對象相互關(guān)聯(lián)起來,使得其中的一個對象作為另外一個對象的一部分。
    關(guān)聯(lián)特性只有在Mac OS X V10.6以及以后的版本上才是可用的。

在類的定義之外為類增加額外的存儲空間

    使用關(guān)聯(lián),我們可以不用修改類的定義而為其對象增加存儲空間。這在我們無法訪問到類的源碼的時候或者是考慮到二進制兼容性的時候是非常有用。
    關(guān)聯(lián)是基于關(guān)鍵字的,因此,我們可以為任何對象增加任意多的關(guān)聯(lián),每個都使用不同的關(guān)鍵字即可。關(guān)聯(lián)是可以保證被關(guān)聯(lián)的對象在關(guān)聯(lián)對象的整個生命周期都是可用的(在垃圾自動回收環(huán)境下也不會導(dǎo)致資源不可回收)。

創(chuàng)建關(guān)聯(lián)

    創(chuàng)建關(guān)聯(lián)要使用到Objective-C的運行時函數(shù):objc_setAssociatedObject來把一個對象與另外一個對象進行關(guān)聯(lián)。該函數(shù)需要四個參數(shù):源對象,關(guān)鍵字,關(guān)聯(lián)的對象和一個關(guān)聯(lián)策略。當(dāng)然,此處的關(guān)鍵字和關(guān)聯(lián)策略是需要進一步討論的。
  ■  關(guān)鍵字是一個void類型的指針。每一個關(guān)聯(lián)的關(guān)鍵字必須是唯一的。通常都是會采用靜態(tài)變量來作為關(guān)鍵字。
  ■  關(guān)聯(lián)策略表明了相關(guān)的對象是通過賦值,保留引用還是復(fù)制的方式進行關(guān)聯(lián)的;還有這種關(guān)聯(lián)是原子的還是非原子的。這里的關(guān)聯(lián)策略和聲明屬性時的很類似。這種關(guān)聯(lián)策略是通過使用預(yù)先定義好的常量來表示的。
    下面的代碼展示了如何把一個字符串關(guān)聯(lián)到一個數(shù)組上。

列表7-1 把一個字符串關(guān)聯(lián)到一個數(shù)組


static char key;


-(void)showInView:(UIView *)view completeBlock:(void (^)(NSInteger btnIndex))block

{

    if (block) {

        ////移除所有關(guān)聯(lián)

        objc_removeAssociatedObjects(self);

        /**

         1 創(chuàng)建關(guān)聯(lián)(源對象,關(guān)鍵字,關(guān)聯(lián)的對象和一個關(guān)聯(lián)策略。)

         2 關(guān)鍵字是一個void類型的指針。每一個關(guān)聯(lián)的關(guān)鍵字必須是唯一的。通常都是會采用靜態(tài)變量來作為關(guān)鍵字。

         3 關(guān)聯(lián)策略表明了相關(guān)的對象是通過賦值,保留引用還是復(fù)制的方式進行關(guān)聯(lián)的;關(guān)聯(lián)是原子的還是非原子的。這里的關(guān)聯(lián)策略和聲明屬性時的很類似。

         */

        objc_setAssociatedObject(self, &key, block, OBJC_ASSOCIATION_COPY);

        //設(shè)置delegate

        self.delegate = self;

        

    }

    [self showInView:view];

}


-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{

    //獲取上門關(guān)聯(lián)的bolck

    void (^block)(NSInteger btnIndex) = objc_getAssociatedObject(self, &key);

    

    if (block) block(buttonIndex);

}




/**

 OC中的關(guān)聯(lián)就是在已有類的基礎(chǔ)上添加對象參數(shù)。來擴展原有的類,需要引入#import <objc/runtime.h>頭文件。關(guān)聯(lián)是基于一個key來區(qū)分不同的關(guān)聯(lián)。

 常用函數(shù): objc_setAssociatedObject     設(shè)置關(guān)聯(lián)

 objc_getAssociatedObject     獲取關(guān)聯(lián)

 objc_removeAssociatedObjects 移除關(guān)聯(lián)

 */


@end


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI