轉(zhuǎn)載:http://blog.csdn.net/u014220518/article/details/52873164
一.objc/runtime.h相關(guān)Objecitve-C的重要特性是Runtime(運(yùn)行時(shí))已卸,在Interacting with the Runtime(交互運(yùn)行)中蓝牲,運(yùn)行時(shí)函數(shù)部分翘骂,蘋果給出了/usr/lib/libobjc.A.dylib庫(kù)芽狗,這個(gè)共享庫(kù)提供支持動(dòng)態(tài)屬性的objective - c語(yǔ)言豺旬,通過(guò)其接口,可以用于開(kāi)發(fā)將其他語(yǔ)言運(yùn)行于Objective-C上的中間層(橋接層)溯警,庫(kù)里的函數(shù)定義為純C語(yǔ)言戈抄。 二.objc/runtime.h使用在這里我們主要舉個(gè)簡(jiǎn)單的栗子??,通過(guò)新建一個(gè)UIButton的類別。1.導(dǎo)入頭文件#import2.新建一個(gè)Action的Category呀癣;然后在.h中添加一個(gè)事件的Block美浦,代碼如下:[objc] view plain copy 在CODE上查看代碼片派生到我的代碼片#importtypedef void (^ActionBlock)(UIButton *button);
@interface UIButton (Action)
@property (nonatomic,copy) ActionBlock actionBlock;
+ (UIButton *)createBtnWithFrame:(CGRect)frame title:(NSString *)title actionBlock:(ActionBlock)actionBlock;
@end
在這里我們創(chuàng)建了一個(gè)加方法,來(lái)創(chuàng)建一個(gè)按鈕十艾;
實(shí)現(xiàn)如下:
[objc] view plain copy 在CODE上查看代碼片派生到我的代碼片
+ (UIButton *)createBtnWithFrame:(CGRect)frame title:(NSString *)title actionBlock:(ActionBlock)actionBlock{
UIButton *button = [[UIButton alloc]init];
button.frame = frame;
[button setTitle:title forState:UIControlStateNormal];
[button addTarget:button action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
objc_setAssociatedObject (button , &keyOfMethod, actionBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
return button;
}
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
id object? ? ? ? ? ? ? ? ? ? :表示關(guān)聯(lián)者抵代,是一個(gè)對(duì)象,變量名理所當(dāng)然也是object
const void *key? ? ? ? ? ? ? :獲取被關(guān)聯(lián)者的索引key
id value? ? ? ? ? ? ? ? ? ? ? :被關(guān)聯(lián)者忘嫉,這里是一個(gè)block
objc_AssociationPolicy policy : 關(guān)聯(lián)時(shí)采用的協(xié)議荤牍,有assign,retain庆冕,copy等協(xié)議康吵,一般使用OBJC_ASSOCIATION_RETAIN_NONATOMIC
注意這里面我聲明了兩個(gè)索引KEY;
[objc] view plain copy 在CODE上查看代碼片派生到我的代碼片
static NSString *keyOfMethod;
static NSString *keyOfBlock;
[objc] view plain copy 在CODE上查看代碼片派生到我的代碼片
- (void)buttonClick:(UIButton *)button{
//通過(guò)key獲取被關(guān)聯(lián)對(duì)象
//objc_getAssociatedObject(id object, const void *key)
ActionBlock block1 = (ActionBlock)objc_getAssociatedObject(button, &keyOfMethod);
if(block1){
block1(button);
}
ActionBlock block2 = (ActionBlock)objc_getAssociatedObject(button, &keyOfBlock);
if(block2){
block2(button);
}
}
- (void)setActionBlock:(ActionBlock)actionBlock{
objc_setAssociatedObject (self, &keyOfBlock, actionBlock, OBJC_ASSOCIATION_COPY_NONATOMIC );
}
- (ActionBlock)actionBlock{
return objc_getAssociatedObject (self ,&keyOfBlock);
}
3.通過(guò)類別創(chuàng)建兩個(gè)按鈕
[objc] view plain copy 在CODE上查看代碼片派生到我的代碼片
- (void)uiConfig{
//第一個(gè)按鈕
UIButton *button1 = [UIButton createBtnWithFrame:CGRectMake((ScreenWidth - 100)/2, (ScreenHeight - 50)/2 - 50, 100, 50) title:@"按鈕" actionBlock:^(UIButton *button) {
float r = random()%255/255.0;
float g = random()%255/255.0;
float b = random()%255/255.0;
self.view.backgroundColor = RGB(r, g, b);
}];
button1.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:button1];
//第二個(gè)按鈕
UIButton *button2 = [UIButton createBtnWithFrame:CGRectMake((ScreenWidth - 100)/2, CGRectGetMaxY(button1.frame) + 50, 100, 50) title:@"按鈕2" actionBlock:nil];
button2.actionBlock = ^(UIButton *button){
NSLog(@"---%@---",button.currentTitle);
};
button2.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:button2];
}
UIButton的擴(kuò)展.h文件#importtypedef void (^btnBlock)();@interface UIButton (Block)- (void)handelWithBlock:(btnBlock)block;@end.m文件#import "UIButton+Block.h"#importstatic const char btnKey;
@implementation UIButton (Block)
- (void)handelWithBlock:(btnBlock)block
{
if (block)
{
objc_setAssociatedObject(self, &btnKey, block, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
[self addTarget:self action:@selector(btnAction) forControlEvents:UIControlEventTouchUpInside];
}
- (void)btnAction
{
btnBlock block = objc_getAssociatedObject(self, &btnKey);
block();
}
@end