iOS runtime (4)

iOS runtime 机制解读(结合 objc4 源码) 欢迎访问我的博客原文 Runtime 是指将数据类型的确定由编译时推迟到了运行时。它是一套底层的纯 C 语言 API,我们平时编写的 Objective-C 代码,最终都会转换成 runtime 的 C 语言代码。 不过,runtime API 的实现是用 C++ 开发的(源码中的实现文件都是 .mm 文件)。 为了更全面地理解 runtime 机制,我们结合最新的objc4 源码来进行解读。... 阅读详情

用C代替OC:


#import <objc/runtime.h>

#import <objc/message.h>

#import <stdio.h>


extern int UIApplicationMain (int argc,char *argv[],void *principalClassName,void *delegateClassName);



struct Rect {

  float x;

  float y;

  float width;

  float height;

};

typedef struct Rect Rect;



void *navController;

static int numberOfRows =100;




int tableView_numberOfRowsInSection(void *receiver,structobjc_selector *selector,void *tblview,int section) {

  returnnumberOfRows;

}


void *tableView_cellForRowAtIndexPath(void *receiver,structobjc_selector *selector,void *tblview,void *indexPath) {

  Class TableViewCell = (Class)objc_getClass("UITableViewCell");

  void *cell = class_createInstance(TableViewCell,0);

  objc_msgSend(cell, sel_registerName("init"));

  char buffer[7];

  int row = (int) objc_msgSend(indexPath, sel_registerName("row"));

  sprintf (buffer, "Row %d", row);

  void *label =objc_msgSend(objc_getClass("NSString"),sel_registerName("stringWithUTF8String:"),buffer);

  objc_msgSend(cell, sel_registerName("setText:"),label);

  return cell;

}


void tableView_didSelectRowAtIndexPath(void *receiver,structobjc_selector *selector,void *tblview,void *indexPath) {

  Class ViewController = (Class)objc_getClass("UIViewController");

  void * vc = class_createInstance(ViewController,0);

  objc_msgSend(vc, sel_registerName("init"));

  char buffer[8];

  int row = (int) objc_msgSend(indexPath, sel_registerName("row"));

  sprintf (buffer, "Item %d", row);

  void *label =objc_msgSend(objc_getClass("NSString"),sel_registerName("stringWithUTF8String:"),buffer);

  objc_msgSend(vc, sel_registerName("setTitle:"),label);

  objc_msgSend(navController,sel_registerName("pushViewController:animated:"),vc,1);

}


void *createDataSource() {

  Class superclass = (Class)objc_getClass("NSObject");

  Class DataSource = objc_allocateClassPair(superclass,"DataSource",0);

  class_addMethod(DataSource,sel_registerName("tableView:numberOfRowsInSection:"), (void(*))tableView_numberOfRowsInSection,nil);

  class_addMethod(DataSource,sel_registerName("tableView:cellForRowAtIndexPath:"), (void(*))tableView_cellForRowAtIndexPath,nil);

  objc_registerClassPair(DataSource);

  returnclass_createInstance(DataSource,0);

}


void * createDelegate() {

  Class superclass = (Class)objc_getClass("NSObject");

  Class DataSource = objc_allocateClassPair(superclass,"Delegate",0);

  class_addMethod(DataSource,sel_registerName("tableView:didSelectRowAtIndexPath:"), (void(*))tableView_didSelectRowAtIndexPath,nil);

  objc_registerClassPair(DataSource);

  returnclass_createInstance(DataSource,0);

}




void applicationdidFinishLaunching(void *receiver,structobjc_selector *selector,void *application) {

  Class windowClass = (Class)objc_getClass("UIWindow");

  void * windowInstance = class_createInstance(windowClass, 0);

    

  objc_msgSend(windowInstance, sel_registerName("initWithFrame:"),(Rect){0,0,320,480});

  

  //Make Key and Visiable

  objc_msgSend(windowInstance,sel_registerName("makeKeyAndVisible"));


  //Create Table View

  Class TableViewController = (Class)objc_getClass("UITableViewController");

  void *tableViewController = class_createInstance(TableViewController, 0);

  objc_msgSend(tableViewController, sel_registerName("init"));

  void *tableView = objc_msgSend(tableViewController,sel_registerName("tableView"));

  objc_msgSend(tableView, sel_registerName("setDataSource:"),createDataSource());

  objc_msgSend(tableView, sel_registerName("setDelegate:"),createDelegate());

 

  Class NavController = (Class)objc_getClass("UINavigationController");

  navController = class_createInstance(NavController,0);

  objc_msgSend(navController,sel_registerName("initWithRootViewController:"),tableViewController);

  void *view =objc_msgSend(navController,sel_registerName("view"));

  

  //Add Table View To Window

  objc_msgSend(windowInstance, sel_registerName("addSubview:"),view);

}



//Create an class named "AppDelegate", and return it's name as an instance of class NSString

void *createAppDelegate() {

  Class mySubclass = objc_allocateClassPair((Class)objc_getClass("NSObject"),"AppDelegate",0);

  structobjc_selector *selName =sel_registerName("application:didFinishLaunchingWithOptions:");

  class_addMethod(mySubclass, selName, (void(*))applicationdidFinishLaunching,nil);

  objc_registerClassPair(mySubclass);

  returnobjc_msgSend(objc_getClass("NSString"),sel_registerName("stringWithUTF8String:"),"AppDelegate");

}



int main(int argc, char *argv[]) {

  returnUIApplicationMain(argc, argv,0,createAppDelegate());

}



运行效果:

UE4打包并加载Pak-Windows/iOS/Android不同平台Editor/Runtime不同运行模式兼容 1.制作加密的Pak文件 1.1.生成加密密码 选择任意一个32位数字,如"12345678123456781234567812345678",进行Base64加密,得到加密后的字符串"MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2Nzg=" 1.2.生成加密文件 创建一个Json文件,如"CryptJson.json" 将密码写入该文件中{ “EncryptionKey”:{“Key”:“MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2 阅读详情

相关推荐

VLA-JEPA:具身智能中潜空间世界模型的工程落地实践

世界模型是具身智能实现环境理解与因果推演的核心基础,其本质是在状态空间中建模‘动作→结果’的动力学规律。传统基于像素或文本的世界模型因高维、非平稳、弱语义等缺陷,在真实机器人场景中鲁棒性差、部署成本高。JEPA(联合嵌入预测架构)通过构建物理约束的潜空间,将视觉-语言-动作(VLA)信号统一编码为低维、可微、可解释的状态表征,显著提升模型对抖动、遮挡、光照突变等干扰的适应能力,并支持实时闭环控制。该范式已在UR5e、Franka等多构型机械臂及Jetson边缘平台完成实测验证,成为VLA系统从实验室走向产线

weixin_34357928的博客 336

NavController模块之Nav Guards

NavController有ionViewCanEnter和ionViewCanLeave两个方法,类似于Angular2中的route guards机制。比如你想阻止用户离开一个视图。export class MyClass{ constructor( public navCtrl: NavController ){} pushPage(){ this.navCtrl.pus

张伟array[0]的博客 1101

modelsim软件安装教程及踩坑(极简版)

1.安装的网盘链接:链接:https://pan.baidu.com/s/1ltUfssyXlCnqDmLhWyhlwA提取码:jery 2.步骤(参考博文):https://blog.youkuaiyun.com/weixin_42693097/article/details/90523692?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163521788716780357213801%2522%252C%2522scm%2522%253A%2522

subtitle_的博客 3778

ionic3中NavController类push setRoot相关问题解决

ionic3中NavController类push setRoot相关问题解决

dearbaba_11的博客 273

Cadence IC618/Spectre231安装避坑指南:详解环境变量配置与License管理那些事儿

本文深入解析Cadence IC618/Spectre231安装过程中的环境变量配置与License管理难题,提供从变量冲突解决到高效License管理的实用方案。针对常见的64位标识冲突、路径污染及License服务器连接问题,给出具体诊断步骤和优化建议,帮助用户构建稳定可靠的EDA环境。

weixin_33737134的博客 615

DIKW模型实战:用Obsidian打造个人知识库的5个关键步骤

本文详细介绍了如何利用DIKW模型在Obsidian中构建高效个人知识库的5个关键步骤,从数据收集到智慧应用的全流程实践。通过标记系统、信息加工引擎和知识结晶方法,帮助知识工作者实现从原始数据到决策智慧的认知跃迁,提升个人知识管理效率。

gamma的博客 574

ionic2中 NavController导航组件用法方法关于页面的导航

1.NavController概述         NavController是导航控制器组件的基类,如Nav和Tab。 您可以使用导航控制器导航到应用程序中的页面。 在基本级别,导航控制器是表示特定历史(例如,Tab)的页面的数组。 可以通过按压和弹出页面或在历史记录中的任意位置插入和删除这些数组来操纵整个应用程序。      当前页面是数组中的最后一个页面,或者堆栈的顶部,如果我们想到这样

涂涂 1万+

三极管自激升压电路设计 - 从参数计算到实践验证

本文详细解析了三极管自激升压电路(焦耳小偷电路)的设计原理与实践方法。通过剖析自激振荡机制与三极管电流关系,指导读者完成从核心参数计算、关键元件选型到面包板搭建调试的全过程。文章重点阐述了如何利用电感、三极管等基础元件实现低压直流到高压的转换,是理解开关电源与电磁能量转换的绝佳实践项目。

weixin_29250573的博客 364

ionic2 页面跳转 push() pop() NavController,navParams

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34029949的博客 518

当几何失效时:3D激光SLAM退化场景的本质与应对策略

本文探讨了3D激光SLAM在退化场景(如长廊、隧道等)中的挑战与解决方案。文章从数学角度分析了退化原因,指出信息矩阵秩亏导致某些方向约束缺失。主流算法采用不同策略应对:LeGO-LOAM利用地面约束与解耦优化;LIO-SAM/LVI-SAM通过多传感器融合补偿;FAST-LIO系列依赖IMU短期积分。新兴的RID-LIO方案创新性地利用激光强度信息增强约束,实验显示精度提升63.59%。研究表明,针对不同退化方向需要采用特异性补偿策略,而挖掘现有传感器的潜在信息维度是提升鲁棒性的有效途径。

Studying…… 617

人工智能_大模型095_Web版003_deepseek R1本地安装_私有化部署_支持RAG_调用HTTPAPI做自己的AI应用_安装RagFlow以及使用_---人工智能工作笔记0240

这里的一定要注意,是资源不够用了,可以点击ragflow-server左边的小绿点,查看 结果。注意去把内存改成10G把至少,我这里改成了10G,因为电脑一共就16G,再试试吧.可以看日志,就显示的是没有连接上mysql,结果我一看,mysql,根本没启动.然后下面选择general就可以了,然后点击确定,然后再去点击。手动去启动,然后再去试试,注意,内存这里给8G太小了还是.调成8G了,然后硬盘大了大了一些换成50G了,然后。点击系统模型设置可以看到,选择聊天模型就可以了,

添柴程序猿的专栏 446

ArcGIS Runtime SDKs v10.2.4最新发布(Android、iOS、OSX和.NET)

ArcGIS Runtime SDKs v10.2.4最新发布,包括了:Android、iOS、OS X和.NET四个平台,用户和开发者可以登录Esri开发者网站下载最新的SDK安装包,或者通过云盘下载(http://pan.baidu.com/s/1eQpclTC): 1、Runtime SDK for Android v10.2.4 感谢Android团队的努力,加入了中国用户

ArcGIS产品与技术专栏 8397

YOLO11 改进系列 | 引入2023年 MLCA 的 C3k2_MLCA 模块,近零参数开销的本地-全局通道注意力,适合检测与分割特征增强

本文提出将MLCA(混合局部通道注意力)模块嵌入YOLOv11的C3k2框架中,形成C3k2_MLCA改进结构。该模块通过5×5局部池化和1×1全局池化双路融合,结合ECA式Conv1d生成通道注意力,在几乎不增加参数量的前提下(仅增加66个参数),实现了局部空间信息与全局通道统计的联合建模。相比传统SE和ECA注意力,MLCA保留了空间分布信息,更适合实例分割等需要精细定位的任务。实验表明改进后模型参数量仅增加0.002%,计算量基本不变,是一种高效的注意力增强方案。

qq_44224801的博客 92

iOS runtime详解4

前言:          Objective C的runtime技术功能非常强大,能够在运行时获取并修改类的各种信息,包括获取方法列表、属性列表、变量列表,修改方法、属性,增加方法,属性等等,本文对相关的几个要点做了一个小结。 目录: (1)使用class_replaceMethod/class_addMethod函数在运行时对函数进行动态替换或增加新函数 (2)重载forward

zrhloveswallow的专栏 853

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

iOS_Runtime4_动态添加属性

Runtime动态添加属性,主要是为系统的类写分类,并且属性定义变量,可以不写策略,需要手动实现set以及get方法。 在set方法中可以利用runtime实现动态添加属性。 在get方法中可以利用runtime实现属性值的获取。 为UIImage的类目添加属性imageUrl使用代码示例:// UIImage+Image.h @interface UIImage (Image) @property

翱翔的魁魁 515

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ArcGIS Runtime SDKs v10.2.4最新(Android、iOS、OSX和.NET)

ArcGIS Runtime SDKs v10.2.4最新,它包含:Android、iOS、OS X和.NET四大平台,用户和开发人员可以登录Esri最新的SDK安装包。或者通过云盘下载(http://pan.baidu.com/s/1eQpclTC): 1、Runtime SDK for Android v10.2.4 感谢Android团队的努力,增加了中国用户期待已久的空...

weixin_34319111的博客 216

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ArcGIS Runtime SDK for iOS开发系列教程(4)——如何让你的iOS应用具有GIS能力

  在我们开发iOS的应用程序时,常常需要嵌入地理信息相关的模块来方便用户定位和查找附近的美食、影院等设施。今天,我将给大家介绍如何让你的iOS应用具有ArcGIS提供的GIS能力。   1.使用ArcGIS for iOS提供的MapViewDemo来构建应用;   这种方式是最简单的,也是比较常用的方式。这个Demo为我们配置好了相关的引用路径等信息,提供了最简单的地图浏览功能,...

dengkangong8549的博客 322

Runtime objc4-779.1 一图看懂iOS Runtime消息转发

消息发送流程图 设定消息接受者为receiver 图是用markdown画的,适配可能有点问题,浏览器页面放大看好一些 Created with Raphaël 2.2.0开始objc_msgSend(receiver, SEL)通过receiver,获取isa指针,并获取其class在class的cache中查找SEL是否存在?匹配Method,执行IMP结束在class的method_list...

王学森的专栏 780

iOS13.4 分类重写系统级属性的get方法失效

手贱升级iOS13.4,之前分类重写modalPresentationStyle属性处理viewController全屏失效了,找到问题原因是Xcode 11.4 &iOS 13.4 环境下分类重写系统级属性的get方法会失效。 解决方案:使用runtime方法替换:https://www.cnblogs.com/lijianyi/p/12607377.html ...

韩老魔的博客 761

大钟的ios开发之旅(4)————聊聊Runtime 中的类对象

在AppDelegate.m中的生命周期函数中设置

[conowen]大钟的专栏 3602

runtime最清晰最简单的理解

http://www.jianshu.com/p/e071206103a4

老衲有礼了的博客 278

移动端图像去背景新范式:RMBG-1.4模型的ONNX Runtime Mobile集成实战

你是否还在为移动端图像去背景(Image Background Removal)功能的性能问题而困扰?当用户在社交App中需要实时去除人像背景时,500ms的处理延迟会导致明显的操作卡顿;当摄影应用需要处理4K分辨率图片时,未经优化的模型可能占用超过300MB内存导致应用崩溃;当用户在弱网环境下使用AI修图功能时,模型体积过大带来的下载等待更是严重影响体验。 本文将系统讲解如何将业界领先的RMB...

gitblog_01007的博客 487

Xcode15安装iOS17模拟器及显示iOS真机

升级完Xcode15之后,本地模拟器 Simulator 全被清空,真机也不显示(😴惑),编译按钮也无法点击,只有一个选项(如下图所示)。点击下面的管理设备,可以显示真机设备,但是调试的时候就是没有真机选项,导致没法编译项目,没办法只能去下载iOS17模拟器。

yubingdian2011的专栏 5652

关于linux debian 32搭建toolchain4.2环境的经验

1.在编译./toolchain.sh cctools的时候,如果提示找不到,则清空fprintf_objc.h的所有内容。(原因不明) 2.当所有的内容都安装完成后,编译项目时, 提示#include_next 不见时,替换成 #include 绝对路径 包括后面出现的#include_next ,同样的方法解决。 3.当出现签名失败, util/ldid.cpp(5

califan的专栏 930
上一篇: iOS runtime (3)
下一篇: KVC/KVO原理详解及编程指南
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值