首页 > 其他 > 详细

初窥runtime的作用

时间:2016-04-06 13:27:18      阅读:284      评论:0      收藏:0      [点我收藏+]

运用到runtime需要导入相应的头文件

#import <objc/runtime.h>

1.获取私有成员变量名

    unsigned int count;
    
    //需要导入头文件:你要导出的私有成员的类
    Ivar *ivars = class_copyIvarList([UIButton class], &count);
    
    for (NSInteger i = 0; i < count; i ++) {
    
    Ivar ivar = ivars[i];
    
    const char *name = ivar_getName(ivar);
        
    NSString *ocname = [NSString stringWithUTF8String:name];
        
    NSLog(@"%ld====%@",i,ocname);
    
    }
    //释放内存指针
    free(ivars);
    ivars = NULL;

打印的结果为:

技术分享
2016-04-06 10:53:17.389 ZhangHongAd[851:211282] 0====_externalFlatEdge

2016-04-06 10:53:17.389 ZhangHongAd[851:211282] 1====_contentLookup

2016-04-06 10:53:17.389 ZhangHongAd[851:211282] 2====_contentEdgeInsets

2016-04-06 10:53:17.390 ZhangHongAd[851:211282] 3====_titleEdgeInsets

2016-04-06 10:53:17.390 ZhangHongAd[851:211282] 4====_imageEdgeInsets

2016-04-06 10:53:17.390 ZhangHongAd[851:211282] 5====_backgroundView

2016-04-06 10:53:17.390 ZhangHongAd[851:211282] 6====_floatingContentView

2016-04-06 10:53:17.390 ZhangHongAd[851:211282] 7====_contentBackdropView

2016-04-06 10:53:17.392 ZhangHongAd[851:211282] 8====_imageView

2016-04-06 10:53:17.392 ZhangHongAd[851:211282] 9====_titleView

2016-04-06 10:53:17.392 ZhangHongAd[851:211282] 10====_initialized

2016-04-06 10:53:17.392 ZhangHongAd[851:211282] 11====_lastDrawingControlState

2016-04-06 10:53:17.392 ZhangHongAd[851:211282] 12====_selectGestureRecognizer

2016-04-06 10:53:17.392 ZhangHongAd[851:211282] 13====_buttonFlags

2016-04-06 10:53:17.392 ZhangHongAd[851:211282] 14====_effectiveContentView

2016-04-06 10:53:17.393 ZhangHongAd[851:211282] 15====_maskAnimationView

2016-04-06 10:53:17.393 ZhangHongAd[851:211282] 16====_selectionView

2016-04-06 10:53:17.393 ZhangHongAd[851:211282] 17====_lazyTitleViewFont

2016-04-06 10:53:17.393 ZhangHongAd[851:211282] 18====_contentConstraints

2016-04-06 10:53:17.393 ZhangHongAd[851:211282] 19====_internalTitlePaddingInsets
打印结果

 

2.获取类的私有属性名

    objc_property_t *properties = class_copyPropertyList([UIButton class], &count);
    
    for (NSInteger i = 0; i < count; i ++) {
        
        objc_property_t property = properties[i];
        
        const char *name = property_getName(property);
        
        NSString *ocname = [NSString stringWithUTF8String:name];
        
        NSLog(@"%ld====%@",i,ocname);
        
    }
    //释放内存指针
    free(properties);
    properties = NULL;

 

这个方法跟获取私有成员变量名差不多,直接上代码

技术分享
2016-04-06 11:06:29.451 ZhangHongAd[859:213999] 0====contentEdgeInsets
2016-04-06 11:06:29.451 ZhangHongAd[859:213999] 1====titleEdgeInsets
2016-04-06 11:06:29.451 ZhangHongAd[859:213999] 2====reversesTitleShadowWhenHighlighted
2016-04-06 11:06:29.451 ZhangHongAd[859:213999] 3====imageEdgeInsets
2016-04-06 11:06:29.451 ZhangHongAd[859:213999] 4====adjustsImageWhenHighlighted
2016-04-06 11:06:29.451 ZhangHongAd[859:213999] 5====adjustsImageWhenDisabled
2016-04-06 11:06:29.451 ZhangHongAd[859:213999] 6====showsTouchWhenHighlighted
2016-04-06 11:06:29.451 ZhangHongAd[859:213999] 7====tintColor
2016-04-06 11:06:29.452 ZhangHongAd[859:213999] 8====buttonType
2016-04-06 11:06:29.452 ZhangHongAd[859:213999] 9====currentTitle
2016-04-06 11:06:29.453 ZhangHongAd[859:213999] 10====currentTitleColor
2016-04-06 11:06:29.453 ZhangHongAd[859:213999] 11====currentTitleShadowColor
2016-04-06 11:06:29.453 ZhangHongAd[859:213999] 12====currentImage
2016-04-06 11:06:29.453 ZhangHongAd[859:213999] 13====currentBackgroundImage
2016-04-06 11:06:29.453 ZhangHongAd[859:213999] 14====currentAttributedTitle
2016-04-06 11:06:29.453 ZhangHongAd[859:213999] 15====titleLabel
2016-04-06 11:06:29.453 ZhangHongAd[859:213999] 16====imageView
2016-04-06 11:06:29.453 ZhangHongAd[859:213999] 17====_currentImageColor
2016-04-06 11:06:29.453 ZhangHongAd[859:213999] 18====_externalFlatEdge
2016-04-06 11:06:29.453 ZhangHongAd[859:213999] 19====_wantsAccessibilityUnderline
2016-04-06 11:06:29.453 ZhangHongAd[859:213999] 20====_contentConstraints
2016-04-06 11:06:29.453 ZhangHongAd[859:213999] 21====_internalTitlePaddingInsets
2016-04-06 11:06:29.455 ZhangHongAd[859:213999] 22====hash
2016-04-06 11:06:29.455 ZhangHongAd[859:213999] 23====superclass
2016-04-06 11:06:29.455 ZhangHongAd[859:213999] 24====description
2016-04-06 11:06:29.455 ZhangHongAd[859:213999] 25====debugDescription
打印结果

获取了系统类的私有成员变量跟属性,我们就可以用KVC去改变系统的属性名,用自定义的控件覆盖系统的控件。

 

3.获取类的全部方法名

class_copyMethodList(__unsafe_unretained Class cls, unsigned int *outCount)

4.获取类的全部协议名

class_copyProtocolList(__unsafe_unretained Class cls, unsigned int *outCount)

方法都差不多,在这里就不一一介绍了,大家有兴趣可以自己玩一下。

runtime最基本的应用就是解档跟归档了,很多第三方都用到了runtime来进行数据解析,比较常见的有MJExtension,因为runtime是底层的方法,所以效率特别高,runtime非常的神奇,非常实用,这里这是介绍一点皮毛,有兴趣的朋友可以深入研究一下。

 

初窥runtime的作用

原文:http://www.cnblogs.com/CrazySL/p/5358479.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!