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
相关文章推荐
- iOS日期相关
- iOS开发- 自定义遮罩视图(引导, 功能说明)源码+解析
- iOS 沙盒与文件机制——iOS 编码复习(九)
- iOS-数据缓存
- iOS中传值的几种方式
- iOS -NSURLCache内存缓存
- 界面横竖屏的一些问题总结
- iOS导入三方框架出现"Unknown type name 'NSString'"错误
- ios开发--网易滚动导航栏
- iOS9 新的通讯录框架
- iOS七种传值总结(关键代码)
- [iOS]在运行时为类添加方法
- iOS开发 cocopods详细使用
- iOS开发 cocopods使用详解
- ios开发--高德地图SDK使用简介
- 企业级iOS应用开发实战(看书笔记)
- [ios]使用Masonry为自定义view添加约束时,得先把自定义view添加到父视图上
- iOS 开发证书显示 此证书签发者无效 解决办法
- iOS报错 - If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variabl
- iOS 知识点相同和不同之处