iOS Runtime-OC黑魔法

本文通过一个具体的demo展示了Objective-C中的Runtime机制,包括动态关联方法、属性和消息转发,帮助读者深入理解Runtime在实际项目中的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在项目中经常会发现一些奇怪的功能。不太能找的到代码的出处,但却实现了功能,很可能这是实用了运行时的东西。

运行时即Runtime 。使用起来很有意思。多了解也有助于对oc的理解。

这里我有写个关于Runtime 的demo     https://github.com/WangFeiF/WFRuntime


在这个博客里只是demo的摘要。详细可以下载demo。查看源码。

//
//  ViewController.m
//  Runtime
//
//  Created by 王飞 on 16/5/8.
//  Copyright © 2016年 com.wangfei. All rights reserved.
//

#import "ViewController.h"
#import <objc/runtime.h>
#import "WFPerson.h"
#import "UIImage+Swizzling.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageOrigin;
@property (weak, nonatomic) IBOutlet UIImageView *imageSwizzling;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self sendMessage];
    
    [self methodSwizzling];
}

- (void)sendMessage {
#pragma 消息机制
    Class classPerson  = objc_getClass("WFPerson");
    
    // 同过类创建实例对象
    // 如果这里报错,请将 Build Setting -> Enable Strict Checking of objc_msgSend Calls 改为 NO
    WFPerson *person = objc_msgSend(classPerson, @selector(alloc));
    
    person = objc_msgSend(person,@selector(init));
//    [person eat];
    
    objc_msgSend(person,@selector(runWithCount:),10);
    objc_msgSend(person, @selector(eat));
    
#pragma 动态关联方法
    /**
     *  person 对象并没有 sayHello 方法 这时候  用WFPerson 内部的hello 代替 sayHello
     */
    objc_msgSend(person, @selector(sayHello));

#pragma 消息转发
    /**
     *  person 发给stoke  的方法,通过黑魔法操作,转给了 touch
     */
    objc_msgSend(person, @selector(stoke));
}

#pragma 方法交换  详细操作  看UIImage+Swizzling的分类
- (void)methodSwizzling {
    UIImage *image = [UIImage imageNamed:@"hitLive"];
    _imageOrigin.image = image;
    
    NSLog(@"--------这是分界线---------");
    
    UIImage *imge = [UIImage tuc_imageNamedMethod:@"hitLive"];
    _imageSwizzling.image = imge;
}



@end

还有runtime 中的动态关联属性  可以查看博客: http://blog.youkuaiyun.com/qq_16844001/article/details/51122074




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值