美文网首页
iOS-OC-Runtime使用小谈(objc_setAssoc

iOS-OC-Runtime使用小谈(objc_setAssoc

作者: WuNai | 来源:发表于2017-10-16 17:42 被阅读15次

一.objc/runtime.h相关
Objecitve-C的重要特性是Runtime(运行时),在Interacting with the Runtime(交互运行)中,运行时函数部分,苹果给出了/usr/lib/libobjc.A.dylib库,这个共享库提供支持动态属性的objective - c语言,通过其接口,可以用于开发将其他语言运行于Objective-C上的中间层(桥接层),库里的函数定义为纯C语言。
二.objc/runtime.h使用
在这里我们主要举个简单的栗子��,通过新建一个UIButton的类别。
1.导入头文件

import <objc/runtime.h>

2.新建一个Action的Category;
然后在.h中添加一个事件的Block,代码如下:

#import <UIKit/UIKit.h>  
  
typedef void (^ActionBlock)(UIButton *button);  
  
@interface UIButton (Action)  
  
@property (nonatomic,copy) ActionBlock actionBlock;  
  
+ (UIButton *)createBtnWithFrame:(CGRect)frame title:(NSString *)title actionBlock:(ActionBlock)actionBlock;  
  
@end  

在这里我们创建了一个加方法,来创建一个按钮;
实现如下:

+ (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 :表示关联者,是一个对象,变量名理所当然也是object
const void *key :获取被关联者的索引key
id value :被关联者,这里是一个block
objc_AssociationPolicy policy : 关联时采用的协议,有assign,retain,copy等协议,一般使用OBJC_ASSOCIATION_RETAIN_NONATOMIC
注意这里面我声明了两个索引KEY:

static NSString *keyOfMethod;  
static NSString *keyOfBlock;  
- (void)buttonClick:(UIButton *)button{  
      
    //通过key获取被关联对象  
    //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.通过类别创建两个按钮

- (void)uiConfig{  
    //第一个按钮  
    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];  
      
    //第二个按钮  
    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];  
}  

4.获取苹果私有的APi
这里我们也可以通过runtime获取苹果私有的方法;

#pragma mark - 获取苹果私有的APi方法  
- (void)getiOSPrivateAPi{  
    NSString *className = NSStringFromClass([UIView class]);  
      
    const charchar *cClassName = [className UTF8String];  
      
    id theClass = objc_getClass(cClassName);  
      
    unsigned int outCount;  
      
    Method *m =  class_copyMethodList(theClass,&outCount);  
      
    NSLog(@"%d",outCount);  
      
    for (int i = 0; i<outCount; i++) {  
          
        SEL a = method_getName(*(m+i));  
          
        NSString *sn = NSStringFromSelector(a);  
          
        NSLog(@"%@",sn);  
    }  
}  

注意,这里如果你想看其他的类,你把UIView换成你想要的类就好了;5.DEMO下载地址
http://download.csdn.net/detail/u014220518/9659110

相关文章

  • iOS-OC-Runtime使用小谈(objc_setAssoc

    一.objc/runtime.h相关Objecitve-C的重要特性是Runtime(运行时),在Interact...

  • iOS-OC-Runtime使用小谈(objc_setAsso

    转载:http://blog.csdn.net/u014220518/article/details/528731...

  • 谈Runtime机制和使用的整体化梳理

    谈Runtime机制和使用的整体化梳理 谈Runtime机制和使用的整体化梳理

  • 年轻人应该使用老年机

    年轻人应该使用老年机 屈小单 最近据半月谈报道,使用不当手机,真的会导致眼瞎。 在有关专家调查里,超过59%的人承...

  • 小谈

    大雨如期而至,夏过半, 昨晚睡的安详,梦到与人打架赢了, 打架不好,赢了开心,忍不住笑出声来。 隐约中,仿若自己主...

  • 小谈

    这两年参加过多次大的饭局,最有意思的是在外面餐馆组的饭局,能够在其中体会到很多门道。 前晚,我有幸参加了婷家庭组织...

  • 小谈

    涉足于自然界的是永恒的心智,眼前看到的一切又是多么的迷茫,说一句五蕴皆空,道一遍道法自然,万千道理尽收其中,你所做...

  • 小谈

    不知道多少人在小时候都听说:上了大学后一切都轻松了,课程少了,每天都像是电视剧里的生活似得,散散心,逛逛街……所...

  • 小谈

    8月3日 晚 雨 最近过得很忙碌,浮现的想法更多的是:人活着很痛苦,如果没有父母,没有兄弟姐妹,感觉人生就没有意义...

  • 小谈

    前不久看了荆棘王,得到了一个挺别致的思路。睡美人真的情愿醒来吗? 于是,我小谈一下,对于睡美人的童话,...

网友评论

      本文标题:iOS-OC-Runtime使用小谈(objc_setAssoc

      本文链接:https://www.haomeiwen.com/subject/lnhluxtx.html