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

iOS开发 runtime实现原理以及实际开发中的应用

2016-07-21 11:49 567 查看
自己写了一个小例子:有一些相关知识点和博客文章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 ---------------------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的原理了。
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  对象 应用 博客 runtime