您的位置:首页 > 移动开发 > IOS开发

iOS runTime 机制详解

2016-04-06 14:31 567 查看
//
//  ViewController.m
//  test_CAdisplay_01
//
//  Created by admin on 4/6/16.
//  Copyright © 2016 jeffasd. All rights reserved.
//

#import "ViewController.h"
#import <objc/runtime.h>

#define TICK        NSDate *startTime = [NSDate date];
#define TOCK        NSLog(@"Time: %f", -[startTime timeIntervalSinceNow]);

@interface ViewController ()

@property (nonatomic, strong)CADisplayLink *displayLink;

- (void)messageInfo;
-(int)say:(NSString *)str;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

//    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateTextColor)];
////    self.displayLink.paused = YES;
//    [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

//    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];
//
//    [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

TICK
//    objc_msgSend(self, @selector(messageShow));
[self messageInfo];

int a = [self say:@"something"];
NSLog(@"%d", a);

TOCK

}

- (void)messageShow{
NSLog(@" message ");
}

- (void)handleDisplayLink:(CADisplayLink *)displayLink
{
NSLog(@"the handle ...");
}

- (void)dynamicMethodIMP{
NSLog(@"dynamic ...");
}

+ (BOOL)resolveInstanceMethod:(SEL)sel{
NSLog(@"resolve ... ");

NSString *selectorString = NSStringFromSelector(sel);

NSLog(@"the selectorString is %@", selectorString);

if ([selectorString isEqualToString:@"messageInfo"]) {

//        其中types参数为"i@:@“,按顺序分别表示:
//        i:返回值类型int,若是v则表示void
//        @:参数id(self)
//        ::SEL(_cmd)
//        @:id(str)
//        这些表示方法都是定义好的(Type Encodings),关于Type Encodings的其他类型定义请参考官方文档
//        IMP 的函数,而新方法的实现。该函数必须至少有两个arguments- 自我和_cmd。

class_addMethod(self, NSSelectorFromString(selectorString), (IMP)sayHello, "v@:");
}

if ([selectorString isEqualToString:@"say:"]) {

//        其中types参数为"i@:@“,按顺序分别表示:
//        i:返回值类型int,若是v则表示void
//        @:参数id(self)
//        ::SEL(_cmd)
//        @:id(str)
//        这些表示方法都是定义好的(Type Encodings),关于Type Encodings的其他类型定义请参考官方文档
//        IMP 的函数,而新方法的实现。该函数必须至少有两个arguments- 自我和_cmd。

//        class_addMethod(self, NSSelectorFromString(selectorString), (IMP)sayHello, "v@:");
class_addMethod([self class], @selector(say:), (IMP)say, "i@:@");
}

return YES;
}

int say(id self, SEL _cmd, NSString *str) {
NSLog(@"%@", str);
return 100;//随便返回个值
}

void sayHello(id self, SEL _cmd) {
NSLog(@"Hello");
}

- (id)forwardingTargetForSelector:(SEL)aSelector{

return nil;
}

- (void)forwardInvocation:(NSInvocation *)anInvocation{

}

//-(void)updateTextColor{}
//
//- (void)startAnimation{
//    self.beginTime = CACurrentMediaTime();
//    self.displayLink.paused = NO;
//}
//
//- (void)stopAnimation{
//    self.displayLink.paused = YES;
//    [self.displayLink invalidate];
//    self.displayLink = nil;
//}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: