iOS 之通过反射机制获得变量名

Swift-反射机制学习(简单实现Json格式与对象映射) 因为工作原因,学习ios开发断断续续已经有两个多月了。前阵子在学习网络编程的遗留的一个问题——有关swift反射的内容。Android开发时经常会遇到JSON格式与对象之间的转换,当然现阶段开源框架大把;也有人说“要学会偷懒”;这些也先不论了,不过说实话写框架比单纯的调UI有成就感。 闲话不多了,进入正题。这边文章涉及的知识有协议、扩展、泛型、反射,如这些你不太熟悉,那你自己看。JSON格式: 阅读详情

一、使用介绍


    项目有的时候,会遇到一些特殊的处理,想要根据一个实例的引用,获取这个实例在代码中的名称。比如在处理View的坐标的时候,我们将UIView的坐标信息配置到plist文件中,我们可以设置一个key,再通过这个key来获取配置文件中的坐标等信息。有没有更简单的方法呢,或者我只想简单的用实例变量的变量名做为key。下面就介绍一种简单的,根据实例变量的引用获取实例变量名的办法。

二、引用文件


    第一步,我们需要引入我们需要的头文件,在需要使用的类中引用下面代码

[cpp]  view plain copy
  1. #import <objc/runtime.h>  

三、运行原理


    我们可以从苹果官方的开发文档中查看到详细的运行时的使用方法及API,官方并没有直接提供根据实例的引用获取实例变量名称的办法,所以我们需要自己去实现。

 在官方的API中我们可以找到以下几个方法

    (1)Describes the instance variables declared by a class.    

Ivar * class_copyIvarList(Class cls, unsigned int *outCount)        
       (2)   Reads the value of an instance variable in an object.

 id object_getIvar(id object, Ivar ivar)

     (3) Returns the name of an instance variable.

const char * ivar_getName(Ivar ivar)
根据以上的API,我们可以根据变量的拥有者获取所有变量的Ivar,再迭代所有Ivar,每一次迭代做如下操作
  • 根据(2)中的API,我们可以获取到当前迭代中的Ivar对应的实例变量的引用
  • 将获取到的实例变量与传递过来的实例变量的地址比较
  • 如果地址相同,说明当前的Ivar为传递过来实例变量的Ivar,可以通过(3)获取变量的名称并返回

四、代码

(1)根据上面的原理我们可以得到第一版本的代码,如下:

[cpp]  view plain copy
  1. - (NSString *)nameWithInstance:(id)instance  
  2. {  
  3.     unsigned int numIvars = 0;  
  4.     NSString *key=nil;  
  5.     Ivar * ivars = class_copyIvarList([self.target class], &numIvars);  
  6.     for(int i = 0; i < numIvars; i++) {  
  7.         Ivar thisIvar = ivars[i];  
  8.         if ((object_getIvar(self.target, thisIvar) == instance)) {  
  9.             key = [NSString stringWithUTF8String:ivar_getName(thisIvar)];  
  10.             break;  
  11.         }  
  12.     }   
  13.     free(ivars);  
  14.     return key;  
  15.   
  16. }  

(2)在测试中发现到达上面的if语句的时候,程序有的时候就会crash,经详细测试发现,每次迭代到非objective-c对象的时候,如基本数据类型,BOOL、int、float就会报错。

原因出在object_getIvar这个方法中,当遇到非objective-c对象时,并直接crash,后来查看官方解释

The value of the instance variable specified by ivar, or nil if object is nil.
并没有明确的给出遇到非对象时会crash,也并不会返回nil

我们需要进行一下修正,当遇到非objective-c的时候,需要跳过执行。最终代码如下:

[cpp]  view plain copy
  1. - (NSString *)nameWithInstance:(id)instance  
  2. {  
  3.     unsigned int numIvars = 0;  
  4.     NSString *key=nil;  
  5.     Ivar * ivars = class_copyIvarList([self.target class], &numIvars);  
  6.     for(int i = 0; i < numIvars; i++) {  
  7.         Ivar thisIvar = ivars[i];  
  8.         const char *type = ivar_getTypeEncoding(thisIvar);  
  9.         NSString *stringType =  [NSString stringWithCString:type encoding:NSUTF8StringEncoding];  
  10.         if (![stringType hasPrefix:@"@"]) {  
  11.             continue;  
  12.         }  
  13.         if ((object_getIvar(self.target, thisIvar) == instance)) {  
  14.             key = [NSString stringWithUTF8String:ivar_getName(thisIvar)];  
  15.             break;  
  16.         }  
  17.     }  
  18.     free(ivars);  
  19.     return key;  
  20.   
  21. }
iOS应用安全加固实战:代码混淆与虚拟化技术深度解析 在移动应用开发领域,代码保护是保障应用安全的核心环节。其基本原理是通过技术手段改变代码的可读性与结构,使逆向工程分析变得异常困难。从技术价值看,这不仅能有效保护核心算法、知识产权和商业逻辑,还能防止应用被恶意篡改、破解或数据窃取。在应用场景上,金融支付、游戏防作弊、版权保护及企业级应用对代码安全有着极高需求。本文聚焦iOS平台,深入探讨代码混淆与虚拟化这两大关键技术。代码混淆通过对符号重命名、控制流扁平化和字符串加密,大幅增加静态分析难度;而代码虚拟化则通过自定义指令集和解释器,将关键逻辑转化为字节码,实现 阅读详情

相关推荐

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月10日

前文:SABRE 3D系列机台简介本章节详细阐述了在维护期间锁定电气、机械、热力学及重力组件以及化学管线输入的锁定操作流程,旨在降低人员受伤风险。p42~p55。

weixin_46735260的博客 1612

sis forum index.php,SiS001 获取当前服务器的Ip地址

public board static void main(String[] args) { try { //Enter.https://1024td.com @InetAddress的服务器地址 InetAddress address = InetAddress.getLocalHost(); System.out.println(address.getHostName());//网站主机名 ...

fuli99999的博客 17万+

RPA实战:手把手教你打造抖音自动养号机器人(含避坑指南)

本文详细介绍了如何利用RPA技术从零构建一个智能化的抖音自动养号机器人。内容涵盖环境准备、核心工具选型、拟人化行为流程设计、代码实现模块拆解,并提供了关键的避坑指南与风控对抗策略,帮助开发者高效、稳定地实现账号自动化运营。

orange的博客 559

sis最新ip地址2020入口一_2020青骄第二课堂登录入口官网链接 青骄第二课堂登录平台网址最新_见多识广...

2020青骄第二课堂在线登录平台入口在哪?怎么登录?很多家长不知道,下面小编就给大家汇总了青骄第二课堂在线登录平台入口以及登录网址和手机登录入口,我们一起来看看吧!青骄第二课堂登录入口首页:青骄第二课堂登录入口登录页:login青骄第二课堂网站(电脑版):https://www.2-class.com/2020年全国青少年禁毒知识竞赛竞赛活动分为网上初赛和现场决赛两个阶段:(一)10月12日,数字...

weixin_39735012的博客 2万+

1688店铺所有商品API接口(整店商品查询API接口)

1688店铺所有商品API接口、1688店铺列表API接口,1688店铺API接口,1688店铺查询商品API接口,1688店铺商品API接口,1688店铺详情接口,1688商品API接口

tbprice的博客 1568

C++(Qt)软件调试---内存分析工具Heob(26)

绝对最全面最详细的Heob使用说明。(图文并茂) 绝大部分的文章都说Heob是一个内存泄漏分析工具,其实Heob只是内存泄漏分析功能比较突出,实际上Heob可以分析很多内存问题。 Heob是一个Windows下检测缓冲区溢出(野指针、空指针、内存越界、重复释放、异常捕获等)和内存泄漏的工具,集成到Qt Creator中,功能强大,简单容易上手。

mahuifa的博客 4311

sis forum index.php,SiS001

Sexual Material Warning:If you are under 21 years of age, or if it is illegal to view adult material in your community, please leave now. We can"t be held responsible for your actions. We are not acti...

weixin_42350101的博客 4万+

YOLOv8人工智能与深度学习——强化学习

本文介绍了将YOLOv8目标检测模型与强化学习结合的方法。主要应用包括自适应目标检测(动态调整检测参数)、主动学习(智能选择标注样本)和多目标跟踪优化。实现方案采用深度Q网络策略,通过定义状态表示、动作空间和奖励函数,使检测系统能根据环境反馈优化性能。该方法具有自适应优化、资源高效、持续改进等优势,能构建更智能的计算机视觉系统。文章详细说明了强化学习环境的构建、策略网络的实现以及训练过程,并提供了代码示例。

u010117029的博客 259

【LeetCode】第409题——最长回文串(难度:简单)

【LeetCode】第409题——最长回文串(难度:简单)题目描述解题思路代码详解注意点 题目描述 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。 注意: 假设字符串的长度不会超过 1010。 示例 1: 输入:“abccccdd” 输出:7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。 来源:力扣(LeetCode) 链接:https://leetcode-cn.co

Se7en_Dayz的博客 1万+

Unity零基础到入门 ☀️| 【UI系统学习】认识Unity引擎中几种最常用 UI系统,这一篇文章就够用了!

轻松学会 Unity 的 UGUI基础控件 使用 Unity中的UI介绍 UI即User Interface(用户界面)的简称。泛指用户的操作界面,UI设计主要指界面的样式,美观程度。而使用上,对软件的人机交互、操作逻辑、界面美观的整体设计则是同样重要的另一个门道。好的UI不仅是让软件变得有个性有品味,还要让软件的操作变得舒适、简单、自由,充分体现软件的定位和特点。 据我所知Unity中有两种自带的UI,一种是UGUI,一种是GUI Legacy GUI:旧版 UI,只有两个组件:文字和图片,配合鼠标事件来

努力前行,总会成为自己心中的那道光 2万+

20、七鳃鳗繁殖与早期生活史:从水质到养殖的全面解析

本文全面解析了七鳃鳗的繁殖与早期生活史,重点探讨了水质对幼体生存的影响、养殖密度与生长关系、变态过程的时间与大小特征,以及人工繁殖在濒危物种恢复和入侵物种控制中的应用。同时,文章分析了大规模养殖面临的挖掘基质需求、空间限制、清洁管理、疾病防控及微生物环境等挑战,并强调实验室养殖对科学研究和种群管理的重要意义。随着技术进步,未来有望扩展更多物种的繁殖研究,揭示七鳃鳗生物学的进化奥秘,实现资源的可持续利用。

l6m7n8的博客 115

[前端面试]2020 前端面试 | 第一波面试题总结

原本链接:https://juejin.im/post/5e3d898cf265da5732551a56 前言 先介绍一下自己的情况吧 内蒙古呼和浩特某大学毕业,专科,计算机多媒体专业毕业 16年出来工作,工作经验四年,之前主要做平面相关,自己喜欢瞎折腾,从17年开始研究前端,然后公司内部转岗到开发部门工作,算下来前端经验也快三年之久。 年底由于种种原因想换一份工作,但由于太忙,没认真搞简历...

iChangebaobao的博客 2600

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Golang:反射机制简述

目录 1、反射简述 1.1、反射的基本概念 1.2、reflect 包 1.3、反射的类型对象(reflect.Type) 1.4、反射的类型(Type)与种类(Kind) 1.4.1、 反射种类(Kind)的定义 1.4.2、 从类型对象中获取类型名称和种类 1.5、指针与指针指向的元素 1.6、使用反射获取结构体的成员类型 1.6.1、结构体字段类型 1.6.2、获取成员反射信息 1.7、结构化标签(Struct Tag) 1.7.1、结构体标签的格式 1.7.2、 从结构体

李白 1171

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

yii中怎样加入html语言,yii Html中的a标签使用

Entity Framework的启动速度优化最近开发的服务放到IIS上寄宿之后,遇到一些现象,比如刚部署之后,第一次启动很慢:程序放置一会儿,再次请求也会比较慢.比如第一个问题,可以解释为初次请求某一个服务的时候,需要把程序集加载到内存中可能比 ...MVC项目中,如何访问Views目录下的静态文件! selenium启动Chrome浏览器和禁止证书错误提示弹出要把ChromeDriver放到...

weixin_36036447的博客 170

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

iOS App混淆实战案例:如何用多工具组合提高App安全性

这篇文章分享了iOS支付类App的混淆加固实战案例。通过组合使用源码混淆工具(如Obfuscator-LLVM)、IPA级混淆工具(如Ipa Guard)、资源加密(重命名文件+MD5修改)和反调试技术,实现了多层次的App保护。文章特别强调了测试阶段的重签名验证和上线后的持续监控,指出单一工具不足以保证安全,需要工具链协同工作。案例展示了从代码混淆到资源保护的全流程方案,为开发者提供了抵御逆向攻击的实用参考。

2501_91591841的博客 564

IOS 使用反射进行游戏聚合多渠道

通过传入的字符串来获取类名和函数名调用相应的函数,这样做又一个好处是可以不导入相应的文件,而且完成编译 //调用类函数 Class cls = NSClassFromString(@&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;John&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;); SEL sel0 = NSSelectorFromString(@&amp

书弋江山的博客 626

黑马程序员——反射学习

总的来说,java反射机制是一个很好用的东西,用它可以解决很多死的东西,因为反射机制的灵活行很大,有了他,我们就不要花太多的时间来写操做数据库的代码了,而是方法更多的时间在项目的逻辑功能上,这个可以很大的减少开发时间,而且代码的可读性好

binbinsex的专栏 498

黑马程序员——Java反射-整理笔记

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 反射的概念:          反射就是把Java类中的各种成分映射相成Java类。 反射机制:         简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息。 反射机制的优缺点:       首

nanfp的博客 792

黑马程序员——Java基础---反射

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——- 一、什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息。 二、哪里用到反射机制 有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行

gyk767的博客 545

黑马程序员第九季——高新技术——反射

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------   先来大致了解一下Java的反射机制,这是百度百科里的一段话,下来我会围绕这段话详细解释 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能

qq214347357的专栏 560

黑马程序员_JAVA_反射

一、反射技术         Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 反射就是把Java类中的各种成分映射成相应的java类。 二、Class类 所有的类文件都有共同属性,所以可以向上抽取,把这些共性内容封装

a874508605的专栏 506

黑马程序员——高新技术--反射

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

huang1165441461的博客 519

iOS应用加固实战:从代码混淆到运行时防护的全链路安全方案

在移动应用开发领域,反编译与逆向工程是常见的安全威胁,攻击者利用二进制反编译工具可轻易分析应用逻辑。其核心原理在于静态分析编译后的可执行文件,提取关键算法与数据。为应对此风险,应用加固技术应运而生,旨在通过增加逆向分析难度来保护知识产权与用户数据。该技术具有极高的工程价值,能有效防止核心代码泄露、内购绕过及数据窃取,是保障商业利益的重要防线。典型的应用场景包括金融支付、游戏及涉及敏感算法的App。本文聚焦于iOS平台,深入探讨针对ipa安装包的立体防护体系,涵盖代码混淆、二进制加密、运行时检测及服务器协同等

weixin_33912453的博客 404

黑马程序员——反射

黑马程序员--反射 ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一、概述 1、反射机制 它是Java成为动态语言的一个关键特性,在运行中的Java程序对自身进行检查或者说是自省(Introspection),并 能直接操作程序的内部属性。这个机制允许程序在执行时可以通过反射APIs取得任何一个已知名称的类的信息,并能

mh2015cool的博客 260

黑马程序员————Java部分之反射

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一、概述 反射技术:         Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。         简单一句话:反射技术可

hu19910320的专栏 779
上一篇: iOS 之AutoReleasePool陷阱
下一篇: iOS 之UITapGestureRecognizer活学活用
Shicuf
博客等级 码龄16年 11粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值