一、_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ù)。