iOS-OC-Runtime使用小談(objc_setAssociatedObject)

轉(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ǔ)言,通過其接口,可以用于開發(fā)將其他語(yǔ)言運(yùn)行于Objective-C上的中間層(橋接層),庫(kù)里的函數(shù)定義為純C語(yǔ)言。 二.objc/runtime.h使用在這里我們主要舉個(gè)簡(jiǎn)單的栗子??,通過新建一個(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è)加方法,來創(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{

//通過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.通過類別創(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

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

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

  • iOS開發(fā)系列--網(wǎng)絡(luò)開發(fā) 概覽 大部分應(yīng)用程序都或多或少會(huì)牽扯到網(wǎng)絡(luò)開發(fā),例如說新浪微博、微信等,這些應(yīng)用本身可...
    lichengjin閱讀 4,034評(píng)論 2 7
  • 1、禁止手機(jī)睡眠[UIApplication sharedApplication].idleTimerDisabl...
    DingGa閱讀 1,206評(píng)論 1 6
  • 逃離相機(jī) 避不了的合照里消失側(cè)影 公眾平臺(tái)不留只言片語(yǔ) 就連電話通訊 都吝嗇地不肯接受一個(gè) 奈何又是天意有風(fēng)云 頸...
    釆心賊閱讀 398評(píng)論 0 0
  • 炫寶媽閱讀 119評(píng)論 0 0

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