runtime跳转界面以及动态添加属性

第六节_我的日记本开发手记(6)——Winform运行HTML 这一节我们主要实现了,Winform程序浏览本地HTML文件,类似浏览器。我的日记本开发手记系列自学笔记,第六节——Winform运行HTML。利用NanUI框架实现运行本地HTML文件。CS和BS融合开发,使用 HTML5 / CSS3 / Javascript 等前端技术来构建您的应用程序界面,解决了CS界面不容易输出很美观界面的问题;使用NET 技术,解决了本地访问等问题。... 阅读详情
//
//  ViewController.m
//  Runtime处理界面跳转
//
//  Created by 陆巧怡 on 15/9/15.
//  Copyright (c) 2015年 Simon. All rights reserved.
//

#import "ViewController.h"
#import <objc/runtime.h>
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];

    for (int i = 0; i<5; i++) {
        
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
        btn.frame = CGRectMake(0, 20+50*(i+1), 100, 40);
        [btn setTitle:[NSString stringWithFormat:@"第%d个界面",i+1] forState:UIControlStateNormal];
        btn.tag = i+1;
        [btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:btn];
    }


}
-(void)btnAction:(UIButton *)btn{
    
    NSString *viewcontrollerName = nil;
    
    switch (btn.tag) {
        case 1:
        {
            viewcontrollerName = @"FirstViewController";
        }
            break;
        case 2:
        {
            viewcontrollerName = @"SecondViewController";

        }
            break;
        case 3:
        {
            viewcontrollerName = @"ThreeViewController";

        }
            break;
        case 4:
        {
            viewcontrollerName = @"FourViewController";

        }
            break;
        case 5:
        {
            viewcontrollerName = @"FiveViewController";

        }
            break;
        default:
            break;
    }
    
    
    [self pushViewcontroller:viewcontrollerName];
}

-(void)pushViewcontroller:(NSString *)viewcontrollerName{
    
    
    
    //类名转换成char字符,用于下面创建类
    const char *className = [viewcontrollerName cStringUsingEncoding:NSASCIIStringEncoding];
    //获取目标类
    Class targetObject = objc_getClass(className);
    
    //如果这个类不存在===>动态创建类
    if (!targetObject) {
        /*
         运行时创建类只需要三步:
         1、为"class pair"分配空间(使用objc_allocateClassPair).
         2、为创建的类添加方法和成员(上例使用class_addMethod添加了一个方法)。
         3、注册你创建的这个类,使其可用(使用objc_registerClassPair)。
         */
        //创建一个类
        Class newClass = [NSObject class];
        targetObject = objc_allocateClassPair(newClass, className, 0);
        //注册这个类
        objc_registerClassPair(targetObject);
        
    }
    
    //创建对象
    id instanceObject = [[targetObject alloc]init];
    
    /*
        在这里,除了FirstViewController才有一个titleName的属性,其他ViewController都没有
        模拟动态增加属性以及对已有属性进行赋值
     */
    
    [self checkIsPropertyWithInstanceObject:instanceObject withPropertyName:@"titleName" withInstanceName:viewcontrollerName];
    
    [self.navigationController pushViewController:(UIViewController *)instanceObject animated:YES];

}

#pragma mark 检测该对象是否包含该属性。包含就赋值。不包含就增加该属性,然后赋值
-(void)checkIsPropertyWithInstanceObject:(id)instanceObject withPropertyName:(NSString *)propertyName withInstanceName:(NSString *)instanceName{

    u_int count;
    
    //获取该对象里面的所有属性
    objc_property_t *propertys = class_copyPropertyList(object_getClass(instanceObject), &count);
    
    //记录是否有目标属性
    BOOL targetPropertyBool = NO;
    
    //遍历属性
    for (int i =0; i<count; i++) {
        //获取属性名字
        const char *charName = property_getName(propertys[i]);
        //匹配目标属性(propertyName)名字
        if ([[NSString stringWithCString:charName encoding:NSUTF8StringEncoding] isEqualToString:propertyName]) {
            //kvc赋值
            [instanceObject setValue:instanceName forKey:propertyName];
            targetPropertyBool = YES;
        }
    }
    
    /*
     OBJC_ASSOCIATION_ASSIGN;            //assign策略
     OBJC_ASSOCIATION_COPY_NONATOMIC;    //copy策略
     OBJC_ASSOCIATION_RETAIN_NONATOMIC;  // retain策略
     
     OBJC_ASSOCIATION_RETAIN;
     OBJC_ASSOCIATION_COPY;
     */
    /*
     * 
     
     objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
     
     id object 给哪个对象的属性赋值
     const void *key 属性对应的key
     id value  设置属性值为value
     objc_AssociationPolicy policy  使用的策略,是一个枚举值,和copy,retain,assign是一样的,手机开发一般都选择NONATOMIC
     */
    
    //该对象里面没有这个属性(propertyName)则动态添加该属性(propertyName)
    if (!targetPropertyBool) {
        
        const char *charPropertyName = [propertyName cStringUsingEncoding:NSASCIIStringEncoding];
        objc_setAssociatedObject(instanceObject, charPropertyName, instanceName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    free(propertys);
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end

iOS面试中经常问的点 - RunTime 一. RunTime简介RunTime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪个函数,如果调用未实现的函数就会报错。对于OC语言,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要声... 阅读详情

相关推荐

-runtime-:使用Runtime跳转到指定页面:应用场景推送

根据规则跳转到指定的界面(runtime实用篇一) ####在开发项目中,会有这样变态的需求: 推送:根据服务端推送过来的数据规则,跳转到对应的控制器 feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦,可能是这个又可能是那个,能给我做灵活吗?根据后台返回规则任意跳转?) 思考:wocao!这变态的需求,要拒绝他吗? switch判断呗,考虑所有跳转的因素?这不得写死我... switch () { case : break; default: break; } ####我是这么个实现的(runtime是个好东西) 利用runtime动态生成对象、属性、方法这特性,我们可以先跟服务端商量好,定义跳转规则,比如要跳转到A控制器,需要传属性id、type,那么服务端返回字典给我,里面有控制

iOS 万能跳转界面方法 (runtime实用篇一)

作者:汉斯哈哈哈 授权本站转载。 在开发项目中,会有这样变态的需求: 推送:根据服务端推送过来的数据规则,跳转到对应的控制器 feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦,可能是这个又可能是那个,能给我做灵活吗?根据后台返回规则任意跳转?) 思考:wocao!这变态的需求,要拒绝他吗?

qq_16379603的博客 795

手把手教你排查Abaqus中的Johnson-Cook损伤参数:避免因d3正负号导致的仿真失败

本文详细解析了Abaqus中Johnson-Cook损伤参数d3正负号设置的关键问题,帮助用户避免因参数错误导致的仿真失败和Excessive distortion报错。通过对比不同文献定义、提供实操指南和典型错误排查流程,有效提升非线性分析的准确性和效率。

weixin_33960567的博客 353

iOS开发runtime实现任意界面跳转

iOS开发runtime实现任意界面跳转 1.在开发中我们常常有这种需求:比如说现在有一组列表,服务器返回的数据在这组列表中,点击列表的某一行是根据服务器返回的Action字段决定跳转,这个时候的界面跳转其实是不确定的,我们需要根据服务器返回的数据动态判断,这时,就可以通过运行时,只需要传入控制器的名称以及控制器的属性,我们就可以直接执行push操作,下面说说详细实现过程。 2.首先我们创建一

努力,可能成功!放弃,注定失败! 1914

思科模拟器实战:MQTT协议实现物联网设备通信全流程解析

本文详细解析了如何在思科模拟器中利用MQTT协议实现物联网设备通信的全流程。通过搭建网络拓扑、配置MQTT Broker与客户端,并编写发布/订阅逻辑,手把手指导读者完成一个“开关控制电灯”的经典物联网场景实验,帮助零成本掌握物联网通信核心。

weixin_29294975的博客 381

Windows 11下manage-bde命令实战:BitLocker锁了别慌,手把手教你用命令行找回数据

本文详细介绍了在Windows 11系统下使用manage-bde命令解锁BitLocker加密驱动器的实战方法。通过命令行诊断、恢复密钥获取、解锁流程演示及高级故障排除,帮助用户在系统锁定后快速找回数据,特别适合IT技术人员和遇到紧急情况的用户。

weixin_30902251的博客 328

weex数据绑定

1、Weex使用语法({{...}})来对中的模板和里的数据进行绑定. 一旦数据和模板绑定了, 数据上的修改会实时的在模板内容中生效. 示例1:(直接把title和size的数值绑定到模板内容)     {{title}}    module.exports={   data:{    size:55,    title:"字体大小"   }  } 示例2:(

zlh663633的博客 3526

最小二乘(MLS)求点云法向量

MLS算法的基本思想是通过在点云的局部邻域内拟合一个光滑曲面,如平面或多项式曲面,以此来重建和处理点云数据。对于法向量估计,MLS通常在每个点的邻域内拟合局部平面,然后从该平面的法向量作为点的法向量。

twnkie的博客 744

Runtime的应用场景

1、动态给分类添加属性 这个应该使用的比较频繁,通过runtime动态添加属性,可以给系统类添加自定义属性,灵活使用,可以带来神奇的效果。 //(block直接调用手势的action) + (instancetype)mm_gestureRecognizerWithActionBlock:(MMGestureBlock)block { __typeof(self) weakSelf ...

ZhongLv_HoneyMoon的博客 378

SAP CAP core data service 里 association 和 composition 的区别

我们进行 SAP CAP 开发时,在schema.cds里进行数据建模,可以使用 association 和 composition,来描述两个 entity 之间的关联关系。在 SAP BTP 的 Cloud Application Programming Model (CAP) 中,cds文件定义了数据模型,而和是用于建立实体关系的两种关键机制。理解它们的区别对于构建高效、清晰的 CAP 数据模型至关重要。下面,我们将通过严谨的逻辑推理,结合代码示例,深入分析和之间的核心差异。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 322

YOLO26改进 - SPPF模块 | 发论文神器!LSKA注意力改进SPPF,增强多尺度特征提取能力,高效涨点!!!

本文介绍了Large Separable Kernel Attention (LSKA)模块及其在YOLO26中的结合应用。LSKA旨在解决Visual Attention Networks (VAN)使用大内核卷积时的计算效率问题,通过将2D深度卷积层的卷积核分解为级联的水平和垂直1-D卷积核,降低了计算复杂度和内存占用,且使VAN更关注物体形状。我们将集成LSKA的SPPF_LSKA模块引入YOLO26,大量实验表明,改进后的模型在对象识别、检测、分割和稳健性测试上表现出色。

魔改工程师的博客 252

runtime从入门到精通(六)—— runtime在实际开发中的应用

上一篇文章,我们学习了runtime的消息发送和消息转发机制(查看链接: runtime从入门到精通(五)—— 消息发送和消息转发 ),倒到此为止,有关runtime的理论知识介绍就先告于段落,小伙伴们,真正的干货来了,runtime在实际的开发中到底有何牛X的作用?我们该怎么使用这么牛X的工具呢?

奔跑中的IT男 7561

基于 Simulink 的双向 DC/AC 逆变器中 IGBT/MOSFET 寄生参数影响分析实战教程

摘要:本教程详细解析了Simulink中IGBT/MOSFET寄生参数对双向DC/AC逆变器的影响。通过对比理想模型与含寄生参数(如20nH内部电感、50nH回路电感)的仿真,揭示了电压尖峰、高频振荡等实际问题。建模步骤包括搭建基准电路、引入寄生参数、配置高精度求解器(步长10ns),并给出抑制措施:添加RC缓冲电路、调整驱动电阻。关键发现:寄生参数会显著增加开关损耗和EMI噪声,需通过参数扫描优化设计。教程还提供了代数环报错、仿真速度优化等实战技巧,帮助工程师从理想仿真过渡到高保真分析。

xiaoheshang_123的博客 68

runtime从入门到精通(九)—— 万能界面跳转

由于文章篇幅长度原因,笔者单独用一篇文章来介绍使用runtime来实现万能控制器跳转。查看完整的runtime在实际开发中的使用点击链接 ——&gt; runtime从入门到精通(六)—— runtime在实际开发中的应用 在你的开发过程中,是否遇到过如下的需求: 在tableView类型的展示列表中,点击每个cell中人物头像都可以跳转到人物详情,可参见微博中的头像,同理包括转发、评论按...

奔跑中的IT男 2507

038、OIS 光学防抖原理与调试:陀螺仪数据融合、Lens Shift OIS 的闭环控制

本文分享了OIS光学防抖系统的调试经验和关键技术要点。作者通过一个"呼吸感"Bug案例,揭示了陀螺仪数据融合和闭环控制的重要性。系统介绍了OIS的三个关键层次:传感器层(陀螺仪特性)、控制层(复合算法)和执行层(闭环控制)。重点讲解了陀螺仪数据融合的互补滤波实现、Lens Shift闭环控制的PID优化策略(包括积分抗饱和和微分滤波),以及前馈补偿的应用。最后总结了调试中的关键问题:数据同步、霍尔校准、温度补偿和性能评估方法,并给出实用建议:平衡算法复杂度与性能、预留带宽余量、重视产线校准等。文章强调OIS

sundong_81的博客 257

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

iOS 万能跳转界面方法(实用推送跳转、不固定界面跳转)

runtime是个好东西 利用runtime动态生成对象、属性、方法这特性,我们可以先跟服务端商量好,定义跳转规则,比如要跳转到A控制器,需要传属性id、type,那么服务端返回字典给我,里面有控制器名,两个属性名跟属性值,客户端就可以根据控制器名生成对象,再用kvc给对象赋值,这样就搞定了。 比如:根据推送规则跳转对应界面HSFeedsViewController HSFeedsV

xdRao的专栏 3051

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

iOS Runtime实现给一个扩展类添加属性

 Category

yutianlong9306的博客 1273

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

iOS 万能跳转界面方法(runtime实用篇一)

在开发项目中,会有这样的需求: 推送:根据服务端推送过来的数据规则,跳转到对应的控制器 feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦,可能是这个又可能是那个,能给我做活吗?根据后台返回规则来跳吗?) 这时,你wocao!难道这样干的吗? switch判断呗,考虑所有跳转的因素进去?这不得写死你…switch () { case

HHuiHao 1462

OC 中runtime的理解 以及 使用

什么是Runtime 我们写的代码在程序运行过程中都会被转化成runtime的C代码执行,例如[target doSomething];会被转化成objc_msgSend(target, @selector(doSomething));。 OC中一切都被设计成了对象,我们都知道一个类被初始化成一个实例,这个实例是一个对象。实际上一个类本质上也是一个对象,在runtime中用结构体表示。

lkeplei的专栏 2168

ios 通过kvc修改属性会触发kvo_iOS 万能跳转界面方法

作者:饶旭东在使用 JPush 、JMessage、JMLink 等 SDK 时,iOS 客户端可能会收到下发的通知,或者收到回调里的返回参数,在拿到参数后可能会有些场景需要跳转到目标页。通过 runtime 机制我们可以灵活的在服务端控制某条消息跳转到对应目标页。runtime 是个好东西利用 runtime 动态生成对象、属性和方法的特性,我们可以先跟服务端商量好,定义跳转规则。比如要跳转到 ...

weixin_39519769的博客 112
上一篇: @property 那些总结
下一篇: ReactiveCocoa与Functional Reactive Programming
kintan哥
博客等级 码龄12年 11粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值