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 selfNSString *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 ---------------------

http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective%5Bnil%5Dc-runtime(1)%5Bnil%5D-self-and-super/

http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective%5Bnil%5Dc-runtime-(2)%5Bnil%5D-object-and-class-and-meta-class/

http://chun.tips/blog/2014/11/06/bao-gen-wen-di-objective%5Bnil%5Dc-runtime(3)%5Bnil%5D-xiao-xi-he-category/

http://chun.tips/blog/2014/11/08/bao-gen-wen-di-objective%5Bnil%5Dc-runtime(4)%5Bnil%5D-cheng-yuan-bian-liang-yu-shu-xing/

就这些基本能搞懂这个runtime的原理了。



以上是关于iOS开发 runtime实现原理以及实际开发中的应用的主要内容,如果未能解决你的问题,请参考以下文章

ios开发runtime学习五:KVC以及KVO,利用runtime实现字典转模型

iOS 开发:Runtime(详解六)字典转模型

ios开发新手浅谈强大的runtime机制

iOS-『Runtime』详解基础知识

iOS开发之Runtime常用示例总结

Runtime objc4-779.1 Runtime在实际开发中的应用之__attribute__