iOS开发 runtime实现原理以及实际开发中的应用
Posted hbblzjy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发 runtime实现原理以及实际开发中的应用相关的知识,希望对你有一定的参考价值。
自己写了一个小例子:有一些相关知识点和博客文章
A: 首先现在控制器里面初始化一个对象,然后调用对象的方法:
#import "ViewController.h"
#import "Message.h"
#import "NSObject+AssociatedObject.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
Message *message = [Message new];
[message sendMessage:@"Sam Lau"];
@end
B: 对象First的声明:
//
// Message.h
// RuntimeDemo
//
// Created by caijunrong on 7/15/15.
// Copyright © 2015 caijunrong. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Message : NSObject
- (void)sendMessage:(NSString *)word;
@end
对象First的实现:
//
// Message.m
// RuntimeDemo
//
// Created by caijunrong on 7/15/15.
// Copyright © 2015 caijunrong. All rights reserved.
//
#import "Message.h"
#import "MessageForwarding.h"
#import <objc/runtime.h>
@implementation Message
//- (void)sendMessage:(NSString *)word
//
// NSLog(@"normal way : send message = %@", word);
//
//- (void)sendOtherMessage:(NSString *)word
// NSLog(@"sendOtherMessage word:%@",word);
//
#pragma mark - Method Resolution
/// override resolveInstanceMethod or resolveClassMethod for changing sendMessage method implementation
+ (BOOL)resolveInstanceMethod:(SEL)sel
if (sel == @selector(sendMessage:))
//如果是这个方法的话,重新定义一个新的方法,映射过去
class_addMethod([self class], sel, imp_implementationWithBlock(^(id self, NSString *word)
NSLog(@"word = %@", word);
//通过这种方法可以讲找不到的方法重新定义到别的方法去
[self sendOtherMessage:word];
), "v@*");
return YES;
#pragma mark - Fast Forwarding
//- (id)forwardingTargetForSelector:(SEL)aSelector
//
// if (aSelector == @selector(sendMessage:))
// return [MessageForwarding new];
//
//
// return nil;
//
#pragma mark - Normal Forwarding
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
NSMethodSignature *methodSignature = [super methodSignatureForSelector:aSelector];
if (!methodSignature)
methodSignature = [NSMethodSignature signatureWithObjCTypes:"v@:*"];
return methodSignature;
- (void)forwardInvocation:(NSInvocation *)anInvocation
MessageForwarding *messageForwarding = [MessageForwarding new];
if ([messageForwarding respondsToSelector:anInvocation.selector])
[anInvocation invokeWithTarget:messageForwarding];
@end
对象Second的声明:
//
// MessageForwarding.h
// RuntimeDemo
//
// Created by caijunrong on 7/15/15.
// Copyright © 2015 caijunrong. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface MessageForwarding : NSObject
- (void)sendMessage:(NSString *)word;
- (void)sendOtherMessage:(NSString *)word;
@end
对象Second的实现:
//
// MessageForwarding.m
// RuntimeDemo
//
// Created by caijunrong on 7/15/15.
// Copyright © 2015 caijunrong. All rights reserved.
//
#import "MessageForwarding.h"
@implementation MessageForwarding
- (void)sendMessage:(NSString *)word
NSLog(@"fast forwarding way : send message = %@", word);
- (void)sendOtherMessage:(NSString *)word
NSLog(@"MessageForwarding sendOtherMessage word:%@",word);
@end
相关文章:
http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/
http://tech.glowing.com/cn/objective-c-runtime/
然后,关于里面的代码实现有2个比较不错的博客,可以参考
http://blog.sunnyxx.com
http://www.cnblogs.com/biosli/p/NSObject_inherit_2.html
另外还可以补充其他一些:
//-----------------------------------刨根问底Objective-C Runtime ---------------------
就这些基本能搞懂这个runtime的原理了。
以上是关于iOS开发 runtime实现原理以及实际开发中的应用的主要内容,如果未能解决你的问题,请参考以下文章