Runtime学习笔记


1.什么是运行时(Runtime)?
1> Runtime System
* 所有的iOS程序的幕后支撑着都是运行时系统
* iOS程序的方法调用都是要靠运行时系统来支持的
2> Runtime Library
* 一套苹果提供的纯C语言的库(API)
* 运行时库的作用
a)能为一个类动态添加成员变量、动态添加方法、动态修改方法的实现
b)能动态交换2个方法的实现(可以给系统自带的方法替换实现)
*本质上,开发者的编写的OC代码最终都是转成了运行时代码
- (void)test
{
    NSLog(@"123");
}
// NSString 抽象类 不允许继承
[UIImage imageName:@"home.png"];
- (void)test
{
    NSLog(@"run");
}
2.OC代码对应的C++代码
* 命令行
a)进入main.m对应的上层文件夹   
>clang -rewrite-objc main.m
>ls -l  (查看是否有main.cpp文件)
>open main.cpp
OC代码与cpp代码如下:
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <objc/message.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSObject * obj = [[NSObject alloc] init];
        [obj description];

       id other = objc_msgSend(objc_getClass("NSObject"), sel_registerName("alloc"))

        NSObject * obj = objc_msgSend(other, sel_registerName("init"));

        objc_msgSend(obj, sel_registerName("description"));

    }
    return 0;
}
3.Runtime在实际中的应用

应用场景:iOS6向iOS7过渡时风格有较大改变,一些公司需要在不同的系统上呈现不同的应用风格,因此,开发人员需要在6的基础上添加7对应的图片,图片可能是成百上千张的,因为对每一张图片进行系统判断再处理是相当麻烦的,所以我们可以使用运行时来解决这个问题。
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (nonatomic, strong)UIImageView * imageView;

@end
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupSubviews];
    self.imageView.image = [UIImage imageNamed:@"close"]; 
}
- (void)setupSubviews
{
    self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    [self.view addSubview:_imageView];
}
@end
#import "UIImage+Extension.h"
#import <objc/runtime.h>
@implementation UIImage (Extension)

/**
 *   将类装载进内存就会调用1次
 */
+ (void)load
{
    Method originalMethod = class_getClassMethod([UIImage class], @selector(imageNamed:));
    Method diyMethod = class_getClassMethod([UIImage class], @selector(yk_imageNamed:));
    method_exchangeImplementations(originalMethod, diyMethod);
}
+ (UIImage *)yk_imageNamed:(NSString *)name
{
    CGFloat systemVersion = [[UIDevice currentDevice].systemVersion floatValue];
    if(systemVersion >= 7.0){
        name = [name stringByAppendingString:@"_os7"];
    }
    return [UIImage yk_imageNamed:name];
}
@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值