runtime属性的读与写

2023-11-19

通过ivar读、写

这里以Person类为例,来看怎么对属性值进行操作。

Person类有一个属性name

@property (nonatomic, copy) NSString *name;

对应的变量名_name

@synthesize name = _name;

p是实例化的一个对象。需要引入runtime头文件<objc/runtime.h>

  • 通过变量名获取属性值
// get the ivar by variable name
Ivar ivar = class_getInstanceVariable([Person class], "_name");
// read the variable's value
NSString *value = object_getIvar(p, ivar);
  • 给属性赋值
// get the ivar by variable name
Ivar ivar = class_getInstanceVariable([Person class], "_name");
// set the ivar
object_setIvar(p, ivar, value);

举例

这里还是以Person为例,有这么一个需求:用户的登录信息,保存到本地,项目中其他地方可能需要用这些信息。

  • 存储方法
- (void)saveObject:(nullable id)value
    IvarName:(const char *)name forKey:(NSString *)key {
    // get the ivar by variable name
    Ivar ivar = class_getInstanceVariable([Person class], name);
    // set the ivar
    object_setIvar(p, ivar, value);
    // save the ivar
    [[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

这里入参数是 属性值、变量名、存储的key。

操作步骤是 先取到变量对应的Ivar,然后通过object_setIvar()函数给变量赋值,之后写本地缓存。

  • 读取方法
- (NSString *)getObjectWithIvarName:(const char *)name
                             forKey:(NSString *)key
{
    // get the ivar by variable name
    Ivar ivar = class_getInstanceVariable([Person class], name);
    // read the variable's value
    NSString *value = object_getIvar(p, ivar);
    // if value is nil, read from local files.
    value = value ? value : [[NSUserDefaults standardUserDefaults] objectForKey:key];
    // return value
    return value;
}

这里入参数是 变量名、存储变量时用的key。

操作步骤是 先取到变量对应的Ivar,然后通过object_getIvar()函数来读变量的值,如果变量已被赋值,则直接返回,如果变量未被赋值,从缓存中读,缓存中也没有,返回nil。

  • set/get

变量的读、写方法已经完成,下面就是看变量set、get方法了:

- (void)setUserName:(NSString *)userName
{
    [self saveObject:userName IvarName:"_userName" forKey:UserNameKey];
}
- (NSString *)userName
{
    return [self getObjectWithIvarName:"_userName" forKey:UserNameKey];
}

注意这里的ivaName这个参数,是传 const char * 类型的,变量名。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

runtime属性的读与写 的相关文章

  • 将 C 转换为 Swift:向 UITextField 添加放大镜图标

    如何在左侧添加一个放大镜图标UITextField 我找到了类似问题的答案here https stackoverflow com questions 11811705 where can i get the magnifying glas
  • TestFlight 提供反馈按钮

    我正在使用 iOS 8 的最新 testflight 版本 我将自己添加为内部测试人员 现在当我使用 testflight 打开应用程序时 我找不到反馈按钮 如果有人有任何线索 请告诉我 您在 Testflight 应用程序中提供反馈 打开
  • 使用 Protobuf-net,我收到有关 List 未知线路类型的异常

    我已经开始将 Unity iOS 游戏转换为使用 Protobuf net 保存状态 看起来一切正常 直到我将此实例变量添加到GameState ProtoMember 10 public List
  • Admob 广告无法快速显示

    您好 我正在尝试将 admob 广告添加到已使用 swift 上传到应用商店的应用程序中 我在 admob 中制作了一个应用程序并复制了 appid 和广告 id 并显示了各自的横幅广告和插页式广告 这里的问题是当我写这行时 request
  • 无法从 iOS 中的框架访问 .nib(XIB) 文件

    我已经从现有的代码库中创建了一个框架 并尝试在新的代码库中使用它 这很好用 但是当我尝试访问属于我的框架包的一部分的 nib 文件时 我的应用程序崩溃了 这是我用来访问视图控制器 XIB 文件的代码 testViewController c
  • 为什么performSegueWithIdentifier在viewDidLoad中不起作用?

    我试图在视图控制器上调用 viewDidLoad 后立即触发故事板转场 Segue 附加了一个标识符 当从链接到按钮或其他控件的方法内部调用时 它可以正常工作 但它在 viewDidLoad 内部不起作用 它只是默默地失败了 viewDid
  • Swift SpriteKit edgeLoopF​​romRect 问题

    下面的代码可以识别底部和顶部边缘场景和球按预期弹开 但是 那左边缘和右边缘现场的情况一直被破坏 如果施加足够的力 球会离开屏幕 然后最终返回 就好像场景的边缘超出了 iPhone 模拟器窗口的边缘 import SpriteKit clas
  • AppStore 提交:错误 ITMS-9000:“无效的捆绑结构 - 不允许二进制文件‘MyApp.app/BuildAgent’

    我陷入了以下错误 我根本不明白 错误 ITMS 9000 无效的捆绑结构 不允许使用二进制文件 MyApp app BuildAgent 您的应用程序可能只包含一个可执行文件 当我使用 Xcode 从 Archive 导出到 IPA 时 我
  • 将自定义数据包含到 iOS 故障转储中

    你好 堆栈溢出 有一个简单的问题要问您 当我的应用程序在用户的设备上崩溃时 是否可以将自定义错误数据嵌入到自动生成的 iOS 故障转储中 例如 我的 SQlite 数据库由于某种原因无法运行 例如 数据库文件已损坏 我无法从这个错误中恢复
  • 如何从 SDK 实现每个会话的 Google Places 自动完成功能?

    是否可以从 Android 和 iOS 应用程序的 place sdk 实现基于会话的自动完成 根据 6 月 11 日生效的新 Google 地图框架定价 对自动完成的请求可以分为基于击键 会话的请求 我找不到描述实施步骤的文档 除了这个参
  • 从按钮执行 Segue 时应用程序冻结

    我的故事板中有一个按钮 它呈现一个带有模式序列的视图控制器 每次按下此按钮时 应用程序都会冻结 没有崩溃 也没有错误消息 prepareForSegue被调用 所有应该存在的视图控制器都在代码中prepareForSegue 但它们不会出现
  • Swift,以编程方式更改 UICollectionViewCell 和 UILabel(单元格内)的宽度

    我已将单元格 UICollectionViewCell 的宽度设置为等于 UICollectionView 的宽度 并且我尝试对该单元格中包含的 UILabel 执行完全相同的操作 我认为下面的代码准确地解释了我想要实现的目标 所以我在这里
  • 会话重新启动后 AVcapture 会话启动缓慢

    我有一个主视图控制器 它连接到具有 avcapturesession 的第二个视图控制器 我第一次从主视图控制器转向捕获会话控制器 大约需要 50 毫秒 使用 仪器 检查 然后我从捕获会话返回到主视图控制器 然后从主控制器返回到 avcap
  • AVAssetExportSession 无法导出从 iCloud 下载的视频

    我正在尝试创建从用户相册中选择的视频的缩小版本 输出的最大尺寸为 720p 因此 在检索视频时 我使用 mediumQualityFormat as the deliveryMode 如果用户设备中不存在原始视频或其中等质量版本 这会导致
  • 访问目标 c 中的类方法。使用 self 还是类名?

    我正在学习 iOS 编程 并且对以下有关关键字 self 的使用的代码感到困惑 据我了解 self就像Java的this 它指的是当前实例 当我想调用类方法时 通常的方式应该是这样 PlayingCard validSuits 但是侵入实例
  • UIView 圆角 - Swift 2.0?

    我会尝试将一些项目更新到 Swift 2 0 我有一个视图 左上角有一个圆角 在 Swift 没有警告 没有错误 只是没有圆角 这就是它在 Swift let maskPath UIBezierPath roundedRect conten
  • 在 Swift 中从 Parse 加载图像

    我成功地将数据从 Parse 提取到 swift 中 但我的图像似乎没有按照我的方式工作 在我的 cellForRowAtIndexPath 方法中 我执行以下操作 var event AnyObject eventContainerArr
  • CoreBluetooth:检测设备超出范围/连接超时

    我正在设计一个 iOS 框架来处理多个 BLE 设备 均为同一类型 目前一切都运行良好 除了一件事 客户想要一个包含可用设备的列表 但是 我如何检测过去发现的设备何时不再可用 当我尝试连接到不再可用的设备时 会出现另一个问题 文档说 连接尝
  • 是否可以跨 2 个不同的 iOS 应用程序访问数据?

    假设我在 App1 中存储了一些 ID 数据 并希望在同一设备上的 App2 中访问它 平台上可以这样吗 如果没有的话有什么解决方法吗 您可以使用iOS 钥匙扣 http developer apple com library ios do
  • ios - 如何声明静态变量? [复制]

    这个问题在这里已经有答案了 C 中声明的静态变量如下 private const string Host http 80dfgf7c22634nbbfb82339d46 cloudapp net private const string S

随机推荐

  • python爬取考研网的信息

    今天我们使用python来爬取考研网站的信息 目标网站 https yz chsi com cn zsml queryAction do 使用的库 requests bs4 pandas 这些库统一可以使用pip进行统一安装 pip ins
  • VSCode 插件安装:中文(简体)语言包(附带:不生效解决方案)

    文章目录 VSCode 安装插件 中文 简体 语言包 中文语言包不生效解决方案 打开 命令面板 配置显示语言 选择中文 重启VSCode 效果 中文界面 VSCode 安装插件 中文 简体 语言包 插件市场搜索 中文 选择如下插件安装 Ch
  • Vue3自定义指令之前端水印功能实现

    一 前置知识 Vue 中的自定义指令 先来说说 vue2和vue3中自定义全局指令的区别 相同点 指令的应用场景 原理是一致的 不同点 生命周期钩子函数名 指令定义的格式不一样 vue2中自定义全局指令 定义 注册一个全局自定义指令 v f
  • 一篇关于如何用深度学习完成自动上色(Automatic Image Colorization)的论文浅析

    论文标题是 Let there be Color Joint End to end Learning of Global and Local Image Priors for Automatic Image Colorization wit
  • 【转载】英语动词过去式ed的发音规则

    规则动词词尾加 ed有三种读音 1 在清辅音后读作 t 如 asked helped watched stopped 2 在浊辅音和元音后读作 d 如 enjoyed studied moved called 3 在t d后读作 id 如
  • 基于vue-cli3模板的axios封装项目

    为了更便捷的使用项目框架 本模板为空白项目 但是已经为大家封装了axios方法和post get请求 内有基础案例 请大家按着自己项目需要进行修改使用 axios interceptors response use response gt
  • 采样位数、采样率、波特率

    实例 16bit 16K 115200 1 采样位数 即采样值或取样值 就是将采样样本幅度量化 它是用来衡量声音波动变化的一个参数 也可以说是声卡的分辨率 它的数值越大 分辨率也就越高 所发出声音的能力越强 在计算机中采样位数一般有8位和1
  • Spring Cloud 微服务

    Spring Cloud 微服务架构介绍 单体架构 单体架构也称之为单体系统或者是单体应用 就是把系统中所有的功能 模块耦合在一个应用中的架构方式 特点 打包成一个独立的单元 导成一个唯一的 jar 包或者是 war 包 会一个进程的方式来
  • 金算盘高手论坛资料中心_3D006期 菜鸟论坛精英PK专栏 速来围观!!

    点上方 菜鸟选号论坛 点右上角 选 星标 每日上午更新 星标置顶与大神不走散 苹果是置顶 安卓是星标 点击 菜鸟选号论坛 关注我们 论坛明星版块 集全网各路高手之大乘 打造草根明星 展示舞台 同时主要是为广大关注彩友 在每一期 推出个人擅长
  • swift编程入门(非常详细)从零基础入门到精通,看完这一篇就够了

    文章目录 1 读后概述 2 语法笔记 2 1 说明 2 2 基础类型 2 3 运算符 2 4 字符与字符串 2 4 控制流 2 5 函数 2 6 闭包 2 7 枚举 结构体 类 2 8 类的构造与析构 2 9 属性监听器 2 10 类的继承
  • python 图像处理(7):对比度与亮度调整

    图像亮度与对比度的调整 是放在skimage包的exposure模块里面 1 gamma调整 原理 I Ig 对原图像的像素 进行幂运算 得到新的像素值 公式中的g就是gamma值 如果gamma gt 1 新图像比原图像暗 如果gamma
  • 毕业设计-基于微信小程序的电影推荐系统

    目录 前言 课题背景与简介 实现设计思路 一 电影推荐算法的设计与实现 二 电影推荐系统分析与设计 实现效果样例 更多帮助 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力
  • 基于情感词典的情感分析

    思路以及代码都来源于下面两篇文章 一个不知死活的胖子 Python做文本情感分析之情感极性分析 Ran Fengzheng 的博客 基于情感词典的文本情感极性分析相关代码 基于情感词典的情感分析应该是最简单的情感分析方法了 大致说一下使用情
  • http服务器_本地简易http服务器

    本地简易http服务器 下面实现一个简单的http服务器 听起来高大上的样子 其实就是网络通信加上http协议 运用上篇的网络编程的基础模型 上篇的网络通信是开两个vs程序 一个做服务器 一个做客户端 互相发送数据 http服务器其实也是同
  • 【Unity-学习-021】异步实现HTTP请求

    对Http访问操作 Unity中一般使用协程操作 但是协程有一个比较要命的要求就是所在Mono必须在场景中是激活的 所以一些操作就会被限制 所以我们就找办法替代掉协程做一些异步的操作 那就用异步方法 首先扩展一下AsyncOperation
  • java操作RabbitMQ

    文章目录 一 基本消息模型 1 导入依赖 2 准备连接工具类 3 创建消息发送者 生产者 4 创建消息接受者 消费者 5 消息确认机制 ACK 二 Work queues 1 创建消息发送者 2 创建多个消息接受者 3 测试 4 设置能者多
  • QtIFW:制作程序安装包

    程序发布方式一般有两种 1 静态编译发布 这种方式使得程序在编译的时候会将Qt核心库全部编译到一个可执行文件中 其优势是简单单一 所有的依赖库都集中在一起 其缺点也很明显 可执行程序体量较大 2 制作安装包发布 这种方式的原理也简单 就是将
  • 输入延时(Input Delay)与输出延时(Output Delay)

    一 设置输入延时 Input Delay 1 不同的路径需要使用不同的约束 2 输入延时的定义 由下图可以看出Input Delay是以上游芯片的时钟发送沿为参考 上游的输出数据到达FPGA的外部输入端口之间的延迟 输入延迟 input d
  • 你也想拥有你的个人博客吗(阿里云域名+github方案+hexo)

    虽然平时学习有写笔记的习惯 可是都没有上传过 记录一下学习日常吧 以后也会更容易整理了 因为在每个版本 对各个设备的配置情况都有一些细小的区别 希望我的记录也同时可以帮助一下需要的朋友 现在的时间点是2020 9 28 我的电脑是 MacB
  • runtime属性的读与写

    文章目录 通过ivar读 写 举例 通过ivar读 写 这里以Person类为例 来看怎么对属性值进行操作 Person类有一个属性name property nonatomic copy NSString name 对应的变量名 name