在项目中经常会发现一些奇怪的功能。不太能找的到代码的出处,但却实现了功能,很可能这是实用了运行时的东西。
运行时即Runtime 。使用起来很有意思。多了解也有助于对oc的理解。
这里我有写个关于Runtime 的demo https://github.com/WangFeiF/WFRuntime
在这个博客里只是demo的摘要。详细可以下载demo。查看源码。
//
// ViewController.m
// Runtime
//
// Created by 王飞 on 16/5/8.
// Copyright © 2016年 com.wangfei. All rights reserved.
//
#import "ViewController.h"
#import <objc/runtime.h>
#import "WFPerson.h"
#import "UIImage+Swizzling.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageOrigin;
@property (weak, nonatomic) IBOutlet UIImageView *imageSwizzling;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self sendMessage];
[self methodSwizzling];
}
- (void)sendMessage {
#pragma 消息机制
Class classPerson = objc_getClass("WFPerson");
// 同过类创建实例对象
// 如果这里报错,请将 Build Setting -> Enable Strict Checking of objc_msgSend Calls 改为 NO
WFPerson *person = objc_msgSend(classPerson, @selector(alloc));
person = objc_msgSend(person,@selector(init));
// [person eat];
objc_msgSend(person,@selector(runWithCount:),10);
objc_msgSend(person, @selector(eat));
#pragma 动态关联方法
/**
* person 对象并没有 sayHello 方法 这时候 用WFPerson 内部的hello 代替 sayHello
*/
objc_msgSend(person, @selector(sayHello));
#pragma 消息转发
/**
* person 发给stoke 的方法,通过黑魔法操作,转给了 touch
*/
objc_msgSend(person, @selector(stoke));
}
#pragma 方法交换 详细操作 看UIImage+Swizzling的分类
- (void)methodSwizzling {
UIImage *image = [UIImage imageNamed:@"hitLive"];
_imageOrigin.image = image;
NSLog(@"--------这是分界线---------");
UIImage *imge = [UIImage tuc_imageNamedMethod:@"hitLive"];
_imageSwizzling.image = imge;
}
@end
还有runtime 中的动态关联属性 可以查看博客: http://blog.youkuaiyun.com/qq_16844001/article/details/51122074