_cmd以及objc_setAssociatedObject/objc_getAssociatedObject 的使用

一、_cmd

_cmd表示當(dāng)前方法的selector的一個指針,self表示指向當(dāng)前對象的一個指針

例如:

比如,我們要打印當(dāng)前要調(diào)用的方法,可以這樣來寫:

- (void)viewDidLoad{

[super viewDidLoad];

NSLog(@"Current method: %@ %@",[self class],NSStringFromSelector(_cmd));}

輸出結(jié)果如下:

Project[570:11303] Current method: FirstViewController viewDidLoad

二、objc_setAssociatedObject

來把一個對象與另外一個對象進行關(guān)聯(lián)。該函數(shù)需要四個參數(shù):源對象,關(guān)鍵字,關(guān)聯(lián)的對象和一個關(guān)聯(lián)策略。

OBJC_EXPORTvoidobjc_setAssociatedObject(idobject,constvoid *key, idvalue, objc_AssociationPolicy policy)

1.OBJC_EXPORT?打包lib時,用來說明該函數(shù)是暴露給外界調(diào)用的。

2.id object?表示關(guān)聯(lián)者,是一個對象,變量名理所當(dāng)然也是object

3.id value?表示被關(guān)聯(lián)者,變量名是value,它要關(guān)聯(lián)到object上的。

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

5.關(guān)聯(lián)策略表明了相關(guān)的對象是通過賦值,保留引用還是復(fù)制的方式進行關(guān)聯(lián)的;還有這種關(guān)聯(lián)是原子的還是非原子的。這里的關(guān)聯(lián)策略和聲明屬性時的很類似。這種關(guān)聯(lián)策略是通過使用預(yù)先定義好的常量來表示的。

enum{OBJC_ASSOCIATION_ASSIGN=0,

OBJC_ASSOCIATION_RETAIN_NONATOMIC=1,

OBJC_ASSOCIATION_COPY_NONATOMIC=3,

OBJC_ASSOCIATION_RETAIN=01401,

OBJC_ASSOCIATION_COPY=01403};

三、于category很像,都擴展了oc對象的屬性,但objc_setAssociatedObject是運行時來擴展屬性,category是編譯時確定了擴展的屬性。

例如:把一個NSString對象關(guān)聯(lián)到一個NSArray對象上

#import"ViewController.h"

#import//添加運行時文件

constNSString*associatedKey=@"associate_nsarray_with_nsstring_key";//設(shè)置key

@implementationViewController

-(void)viewDidLoad{

NSArray*array=[NSArrayarrayWithObjects:@"111",@"222",@"333",nil];

NSString*string=@"woshishuzi";

// 將string關(guān)聯(lián)到array上

objc_setAssociatedObject(array,&associatedKey,string,OBJC_ASSOCIATION_RETAIN_NONATOMIC);

// 從array中獲取被關(guān)聯(lián)的對象string

NSString*getAssociatedObject=objc_getAssociatedObject(array,&associatedKey);//string已經(jīng)變成array的一個屬性了

NSLog(@"%@",getAssociatedObject);}//輸出結(jié)果:woshishuzi

@end

四、實現(xiàn)

1.動態(tài)向NSObject中添加方法

@interfaceNSObject (CategoryWithProperty)

@property (nonatomic,strong)NSObject *property;

@end

@implementationNSObject (CategoryWithProperty)

- (NSObject *)property {

return objc_getAssociatedObject(self,@selector(property));

}

- (void)setProperty:(NSObject *)value {

objc_setAssociatedObject(self,@selector(property), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

2.動態(tài)擴展屬性

#import"UILabel+Associate.h"

#import

@implementationUILabel (Associate)staticchar flashColorKey;

- (void) setFlashColor:(UIColor *) flashColor{

objc_setAssociatedObject(self, &flashColorKey, flashColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

- (UIColor *) getFlashColor{

return objc_getAssociatedObject(self, &flashColorKey);

}

@end

3.斷開關(guān)聯(lián)

objc_setAssociatedObject(self, &flashColorKey,nil,OBJC_ASSOCIATION_ASSIGN);

斷開關(guān)聯(lián)是使用objc_setAssociatedObject函數(shù),傳入nil值即可。

使用函數(shù)objc_removeAssociatedObjects可以斷開所有關(guān)聯(lián)

//使用函數(shù)objc_removeAssociatedObjects可以斷開所有關(guān)聯(lián)。通常情況下不建議使用這個函數(shù),因為他會斷開所有關(guān)聯(lián)。只有在需要把對象恢復(fù)到“原始狀態(tài)”的時候才會使用這個函數(shù)。

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

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,041評論 0 9
  • 1.runtime體驗 1.1.引言 運行時作為面試題中高階問題必不可少的一個技能點。經(jīng)常面試官會問道是否使...
    2897275c8a00閱讀 1,076評論 0 5
  • lighkLife閱讀 144評論 0 0
  • 點擊作者頭像,可以收看更多精彩文章哦 在開始討論這個話題之前,我必須得說,我把QQ的悄悄話功能屏蔽了。之所以屏蔽,...
    婉青婉青閱讀 1,456評論 3 4
  • 為什么要學(xué)會寫作? 簡單的說,就是這是你想實現(xiàn)財富自由要做的。 寫作是極少數(shù)可以重復(fù)銷售的事情之一。前面有說到要想...
    RexsonXie閱讀 154評論 0 0

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