iOS学习系列 - 扩展机制category与associative
iOS學(xué)習(xí)系列 - 擴(kuò)展機(jī)制category與associative
category與associative作為objective-c的擴(kuò)展機(jī)制的兩個(gè)特性,category即類型,可以通過它來擴(kuò)展方法;associative,可以通過它來擴(kuò)展屬性;在iOS開發(fā)中,可能category比較常見,相對的associative,就用的比較少,要用它必須使用<objc/runtime.h>的頭文件,然后就可以自由使用objc_getAssociatedObject以及objc_setAssociatedObject,我們來看下這兩個(gè)方法:
OBJC_EXPORT?void?objc_setAssociatedObject(id?object,?const?void?*key,?id?value,?objc_AssociationPolicy?policy)__OSX_AVAILABLE_STARTING(__MAC_10_6,?__IPHONE_3_1);
OBJC_EXPORT?id?objc_getAssociatedObject(id?object,?const?void?*key)
__OSX_AVAILABLE_STARTING(__MAC_10_6,?__IPHONE_3_1);
另外還有一個(gè)方法:
OBJC_EXPORT?void?objc_removeAssociatedObjects(id?object)__OSX_AVAILABLE_STARTING(__MAC_10_6,?__IPHONE_3_1);
objc_getAssociatedObject、objc_setAssociatedObject、objc_removeAssociatedObjects都是Obj-c中的外聯(lián)方法,object 參數(shù)作為待擴(kuò)展的對象實(shí)例,key作為該對象實(shí)例的屬性的鍵,而value就是對象實(shí)例的屬性的值,policy作為關(guān)聯(lián)的策略,它的枚舉包括:
enum?{OBJC_ASSOCIATION_ASSIGN?=?0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC?=?1,
OBJC_ASSOCIATION_COPY_NONATOMIC?=?3,
OBJC_ASSOCIATION_RETAIN?=?01401,
OBJC_ASSOCIATION_COPY?=?01403
};
具體我就多說了,可以看得懂的。
另外,objc_removeAssociatedObjects可以刪除指定對象實(shí)例的所有擴(kuò)展屬性。
現(xiàn)在看一個(gè)簡單的例子:(引用網(wǎng)上的例子:http://code4app.com/ios/Block-UI/504fe65d6803faa33f000003?)
這里,定義了一個(gè)"alert view"的按鈕:
UIButton?*button?=?[UIButton?buttonWithType:UIButtonTypeRoundedRect];[viewController.view?addSubview:button];
button.frame?=?CGRectMake(50,?50,?100,?44);
[button?setTitle:@"alert?view"?forState:UIControlStateNormal];
現(xiàn)在對UIButton通過使用category對其進(jìn)行方法擴(kuò)展:
@implementation?UIControl?(BUIControl)…...
-?(void)handleControlEvent:(UIControlEvents)event?withBlock:(void(^)(id?sender))block?{
NSString?*methodName?=?[UIControl?eventName:event];
NSMutableDictionary?*opreations?=?(NSMutableDictionary*)objc_getAssociatedObject(self,?&OperationKey);
if(opreations?==?nil)
{
opreations?=?[[NSMutableDictionary?alloc]?init];
objc_setAssociatedObject(self,?&OperationKey,?opreations,?OBJC_ASSOCIATION_RETAIN);
}
[opreations?setObject:block?forKey:methodName];
[self?addTarget:self?action:NSSelectorFromString(methodName)?forControlEvents:event];
}
objc_getAssociatedObject,objc_setAssociatedObject進(jìn)行屬性擴(kuò)展:
OperationKey是一個(gè)字符類型,這里表示一個(gè)鍵,如果Opreations為空,會(huì)setAssociatedObject一個(gè)新的opreations對象到對應(yīng)鍵的值中間。
addTarget:action:forControlEvents對于觸摸事件進(jìn)行目標(biāo)綁定。
NSSelectorFromString(methodName) 將觸發(fā)方法:
-(void)UIControlEventTouchDown{[self?callActionBlock:UIControlEventTouchDown];}-(void)UIControlEventTouchDownRepeat{[self?callActionBlock:UIControlEventTouchDownRepeat];}
-(void)UIControlEventTouchDragInside{[self?callActionBlock:UIControlEventTouchDragInside];}
-(void)UIControlEventTouchDragOutside{[self?callActionBlock:UIControlEventTouchDragOutside];}
-(void)UIControlEventTouchDragEnter{[self?callActionBlock:UIControlEventTouchDragEnter];}
-(void)UIControlEventTouchDragExit{[self?callActionBlock:UIControlEventTouchDragExit];}
-(void)UIControlEventTouchUpInside{[self?callActionBlock:UIControlEventTouchUpInside];}
-(void)UIControlEventTouchUpOutside{[self?callActionBlock:UIControlEventTouchUpOutside];}
-(void)UIControlEventTouchCancel{[self?callActionBlock:UIControlEventTouchCancel];}
-(void)UIControlEventValueChanged{[self?callActionBlock:UIControlEventValueChanged];}
-(void)UIControlEventEditingDidBegin{[self?callActionBlock:UIControlEventEditingDidBegin];}
-(void)UIControlEventEditingChanged{[self?callActionBlock:UIControlEventEditingChanged];}
-(void)UIControlEventEditingDidEnd{[self?callActionBlock:UIControlEventEditingDidEnd];}
-(void)UIControlEventEditingDidEndOnExit{[self?callActionBlock:UIControlEventEditingDidEndOnExit];}
-(void)UIControlEventAllTouchEvents{[self?callActionBlock:UIControlEventAllTouchEvents];}
-(void)UIControlEventAllEditingEvents{[self?callActionBlock:UIControlEventAllEditingEvents];}
-(void)UIControlEventApplicationReserved{[self?callActionBlock:UIControlEventApplicationReserved];}
-(void)UIControlEventSystemReserved{[self?callActionBlock:UIControlEventSystemReserved];}
-(void)UIControlEventAllEvents{[self?callActionBlock:UIControlEventAllEvents];}
注意到這里會(huì)去執(zhí)行callActionBlock:方法:
-?(void)callActionBlock:(UIControlEvents)event?{NSMutableDictionary?*opreations?=?(NSMutableDictionary*)objc_getAssociatedObject(self,?&OperationKey);
if(opreations?==?nil)?return;
void(^block)(id?sender)?=?[opreations?objectForKey:[UIControl?eventName:event]];
if?(block)?block(self);
}
最終會(huì)從擴(kuò)展屬性中得到^block,關(guān)于^block可以參考:http://blog.csdn.net/pjk1129/article/details/6577097
最后調(diào)用:
[button?handleControlEvent:UIControlEventTouchUpInside?withBlock:^(id?sender)?{UIAlertView?*alert?=?[[UIAlertView?alloc]?initWithTitle:@"alert"
message:nil
delegate:nil
cancelButtonTitle:@"ok"
otherButtonTitles:@"other",nil];
}];
點(diǎn)擊按鈕就會(huì)觸發(fā)一個(gè)block函數(shù)。
這樣就實(shí)現(xiàn)了objective-c的兩種擴(kuò)展機(jī)制。
作者:Leepy 郵箱:sunleepy(AT)gmail.com 出處:http://liping13599168.cnblogs.com/? 本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責(zé)任的權(quán)利。
轉(zhuǎn)載于:https://www.cnblogs.com/zsw-1993/p/4879856.html
總結(jié)
以上是生活随笔為你收集整理的iOS学习系列 - 扩展机制category与associative的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FreeSql (三)实体特性
- 下一篇: 并发编程(多进程1)