尝试使用 object_getIvar 检索值时 EXC_BAD_ACCESS

2024-02-24

我正在尝试学习如何利用 Objective-C 运行时函数。

我有一本字典,其中包含几个name=value pairs.

E.g.

{
    "recipe_description" = "Delicious and healthy.";
    "recipe_id" = 7042366;
    "recipe_image" = "http://www.fatsecret.com/static/recipe/b5b8ccb7-badd-4a7f-8dd4-0ffe4aba8c6d.jpg";
    "recipe_name" = "Brown Rice & Cherry Tomato Cooked Salad";
    "recipe_url" = "http://www.fatsecret.com/recipes/brown-rice-and-cherry-tomato-cooked-salad/Default.aspx";
}

首先,我创建一个运行时类,其中包含与字典中每个对象的键关联的 ivars(例如 ivars = Recipe_description、recipe_id、recipe_image 等)。其次,我将运行时类中每个 Ivar 的值设置为字典中每个相应的对象(例如,recipe_description = Delicious andhealthy 等)。最后,我检索了 Ivar 的值。

我可以检索recipe_name、recipe_id 和recipe_description 的值,但无法检索recipe_url 和recipe_image 的值。当我尝试检索这些值时,我得到一个EXC_BAD_ACCESS code=2, address=0x5线路错误value = object_getIvar(classInstance, ivar); in the valueForIvarContainingName:class: method.

Code:

- (Class)wrapObjectWithName:(NSString *)name ivarNames:(NSArray *)ivarNames
{
    const char *className = [name cStringUsingEncoding:NSASCIIStringEncoding];

    Class objectClass = objc_allocateClassPair([NSObject class], className, 0);

    for (NSString *key in ivarNames)
    {
        const char *iVarName = [key cStringUsingEncoding:NSASCIIStringEncoding];

        class_addIvar(objectClass, iVarName, sizeof(NSString*), log2(sizeof(NSString*)), @encode(NSString*));
    }

    objc_registerClassPair(objectClass);

    return objectClass;
}

- (void)mapValues:(NSDictionary *)dictionary toVariablesInClass:(id)classInstance
{
    NSArray *dictionaryObjectKeys = [dictionary allKeys];

    for (NSString *key in dictionaryObjectKeys)
    {
        const char *iVarName = [key cStringUsingEncoding:NSASCIIStringEncoding];
        Ivar ivar = class_getInstanceVariable([classInstance class], iVarName);

        id value = dictionary[key];

        object_setIvar(classInstance, ivar, value);
    }
}

- (id)valueForIvarContainingName:(NSString *)anIvarName class:(id)classInstance
{
    unsigned int outCount;
    Ivar *iVarList = class_copyIvarList([classInstance class], &outCount);

    id value;

    for (int i = 0; i < outCount; i++)
    {
        Ivar ivar = iVarList[i];

        NSString *ivarName = [NSString stringWithCString:ivar_getName(ivar) encoding:NSASCIIStringEncoding];

        if ([ivarName rangeOfString:anIvarName].location != NSNotFound)
        {
            value = object_getIvar(classInstance, ivar);
            break;
        }
    }

    free(iVarList);

    return value;
}

Usage:

         NSArray *ivarNames = [dictionary allKeys];
         Class FSRecipe = [self wrapObjectWithName:@"FSRecipe" ivarNames:ivarNames];

         id recipe = [[FSRecipe alloc] init];
         [self mapValues:dictionary toVariablesInClass:recipe];

         NSLog(@"%@", [self valueForIvarContainingName:@"image" class:recipe]);

为什么我可以检索recipe_name、recipe_description、recipe_id 值,但不能检索recipe_url 和recipe_image 值?

我猜这可能与 URL 对象有关?我尝试将字典中的每个对象转换为字符串,但这没有效果。

任何帮助是极大的赞赏!


我最终使用了valueForKey:相反,这可能是更好的选择。

E.g.

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

尝试使用 object_getIvar 检索值时 EXC_BAD_ACCESS 的相关文章

  • 在完成块中保留循环

    在我的课堂上 我创建了这个方法 void refreshDatasourceWithSuccess CreateDataSourceSuccessBlock successBlock failure CreateDataSourceFail
  • TestFlight 提供反馈按钮

    我正在使用 iOS 8 的最新 testflight 版本 我将自己添加为内部测试人员 现在当我使用 testflight 打开应用程序时 我找不到反馈按钮 如果有人有任何线索 请告诉我 您在 Testflight 应用程序中提供反馈 打开
  • 如何使用 iOS 可达性

    我正在开发一个使用网络的 iPhone 应用程序 iPhone 通过 HTTP 请求与我的服务器通信 并且应该可以在 WiFi 和 3G 上运行 我目前使用NSURLConnection initWithRequest向我的服务器发送异步请
  • 如何以编程方式设置设备(UI)方向?

    希望屏幕 UI 上的所有内容都能够从横向左向右旋转 反之亦然 我该怎么做呢 这是私人的吗 我知道 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation inte
  • NSCalendar 返回明年第一周上周一的错误日期

    我使用下面的代码使用随机日期来计算上周一 哪个工作文件但我的代码在明年日期中断 下面是相同的代码 NSDate date NSDate dateWithTimeIntervalSince1970 1483620311 228 NSLog c
  • 无法验证包:721772200.itmsp

    我写这篇文章是因为我有一个严重的问题 我在cartoonsmart 网站上购买了Commander Cool 游戏 然而 一个严重的问题发生了 iTune Connect 验证无法接受该申请 我尝试从两个不同的开发者帐户发布它 但错误仍然发
  • scntool:无法转换文件,失败原因:*** -[__NSSingleObjectArrayI objectAtIndex:]:索引 1 超出范围

    我正在 Xcode 9 3 下开发一个基于 iOS 11 3 SceneKit 的项目 我有几个 dae 文件格式的 3D 模型 每当我构建项目时 其中一个模型不会被复制到最终的 iOS 包中 深入研究错误 我在复制捆绑资源构建阶段收到以下
  • 如何开始复杂级别的跨平台移动应用开发? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在iOS中处理1到3个手指的滑动手势

    我使用以下代码来处理代码中的 1 根手指滑动 UISwipeGestureRecognizer swipe UISwipeGestureRecognizer alloc initWithTarget self action selector
  • locationOfTouch 和 numberOfTouches

    你好 我有这个识别器 设置为 2 次触摸 但它只返回一个 而不是两个 CGPoint void gestureLoad UIGestureRecognizer recognizer recognizer UITapGestureRecogn
  • 如何从 SDK 实现每个会话的 Google Places 自动完成功能?

    是否可以从 Android 和 iOS 应用程序的 place sdk 实现基于会话的自动完成 根据 6 月 11 日生效的新 Google 地图框架定价 对自动完成的请求可以分为基于击键 会话的请求 我找不到描述实施步骤的文档 除了这个参
  • 如何保护 iOS 应用程序免受任何操作系统攻击(在越狱设备上)

    我希望保护我的应用程序数据 以防任何操作系统攻击或越狱 iOS 设备上的未经授权的访问 在这种情况下 有什么方法可以检测此类威胁并保护应用程序数据 虽然我同意 jrturton 的说法 但如果您有想要保护的关键数据免受流氓应用程序 而不是用
  • iOS 中 NSDecimalNumber 的小数分隔符错误

    我尝试通过以下方式输出具有正确的小数分隔符的十进制数的描述 NSString strValue 9 94300 NSDecimalNumber decimalNumber NSDecimalNumber decimalNumberWithS
  • dyld:无法加载插入的库

    当我尝试运行 UI 和单元测试时 出现异常 dyld 无法加载插入的库 private var containers Bundle Application AutoTestingApp app Frameworks IDEBundleInj
  • 从按钮执行 Segue 时应用程序冻结

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

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

    我有一个主视图控制器 它连接到具有 avcapturesession 的第二个视图控制器 我第一次从主视图控制器转向捕获会话控制器 大约需要 50 毫秒 使用 仪器 检查 然后我从捕获会话返回到主视图控制器 然后从主控制器返回到 avcap
  • 如何向标准 UIButton 添加徽章? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否可以在标准中添加看起来标准的徽章UIButton 如果不支持半原生 那么实现此目的最简单的方法是什么 示例图片 这是 Sascha
  • 在实例化对象之前是否可以检查故事板中是否存在标识符?

    在我的代码中我有这一行 但我想知道是否有办法检查是否 一些控制器 在我将它与 一起使用之前就存在实例化ViewControllerWithIdentifier 方法 如果标识符不存在 则应用程序崩溃 如果没有好的方法 这并不是一个大问题 我
  • 如何解决 Xcode 5 中的红色(已移动)文件?

    在 Xcode 4 中 当您要移动文件时 可以通过单击右侧菜单中的按钮并通过 Finder 选择新位置来解析文件的新位置 在 Xcode 5 中 右侧菜单中没有按钮 我还没有找到任何方法通过右键单击文件或顶部菜单栏选项来指定文件的新位置 在

随机推荐

  • 我在 .android 文件夹中找不到 adb_usb.ini 文件?

    我必须添加一个调试设备 我们可以通过在 adb usb ini 文件中添加十六进制值来做到这一点 但我无法找到 adb usb ini 文件 任何人都知道为什么它不存在于 android 文件夹中 如果 android 文件夹中不存在 ad
  • Angular 中默认视图封装的工作原理

    众所周知 角度应用程序中组件的默认视图封装是模拟的 即 encapsulation ViewEncapsulation Emulated 如果它不是一个 Shadow dom 我真的不明白它在幕后是如何工作的 Angular 中的封装分为三
  • 在哪里可以下载 64 位 Travis-CI VM 映像?

    这两个blog http ruby journal com debug your failed test in travis ci posts http reidburke com 2013 01 28 debugging travis b
  • Spring MVC:如何从返回字符串的控制器方法对模型的属性进行单元测试?

    例如 package com spring app import org springframework stereotype Controller import org springframework ui Model import or
  • Swift 3:在 SKSpriteNode 上切一个洞

    首先 我知道 这个问题在这里已经有很多答案 但它们并没有帮助我解决这个问题 我编写了一个小游戏 第一次启动时有一个小教程 其中逐步解释了游戏的每个元素 在每一步中 我都想强调其中一个要素 所以我在元素前面放置了一个 alpha 为 0 9
  • 如何使用 vue.js 获取所选选项的索引

    抱歉新手问题 但是我如何从选择框中获取所选元素的索引并运行函数 我下面的代码不会触发 switchView 函数
  • Virtualbox 虚拟机上的 Windows 7:是否兼容 OpenGL 1.x?

    在 Windows 7 客户机的 VirtualBox 虚拟机设置 或系统信息 中 我无法查明我的虚拟显卡是否兼容 OpenGL 1 x 我需要 OpenGL 1 x 兼容性才能进行测试黑莓7模拟器 http developer black
  • 格式化Remove-Item命令的详细输出

    我有以下命令 Get ChildItem build path Include bak orig txt chirp config Recurse Remove Item Verbose 从 VS 解决方案的构建文件夹中清除一些文件 我使用
  • 升级到 Mountain Lion 和 XCode 4 破坏了我的“品牌”?

    TL DR 我升级了一些东西 现在我无法运行 make wtf 我刚刚从 Mac OS X 10 6 升级到 10 8 Mountain Lion 然后安装了 XCode 4 以前我有 Developer Applications Xcod
  • 我已将项目升级到 Razor 视图引擎,但 VS2010 仍然自动生成 WebForms

    我已经升级到 MVC3 和 Razor 一切正常 然而 在我的return View model 视图 是红色的 VS2010 将帮助我生成一个视图 当我这样做时 它会生成一个 aspx WebForms 视图 项目中没有其他 aspx 文
  • Matplotlib 无法在 Windows 10 上运行 - DLL 无法加载

    我已经在 Windows 10 机器上安装了 matplotlib pip3 install matplotlib 我收到一条消息 表明它正在使用轮子 matplotlib 3 4 1 cp39 cp39 win amd64 whl1 当我
  • MIDI 入门

    我想编写一个应用程序 从我的 MIDI 钢琴中读取 USB MIDI 数据 并且很可能从我能找到的任何其他 MIDI 数据中读取数据 正在寻找一个与 NET 一起使用的库 并且即使另一个应用程序正在使用 MIDI 也允许我 拦截 此数据 T
  • 事件计数的窗口聚合

    我对我的卡夫卡事件进行了分组 private static void createImportStream final StreamsBuilder builder final Collection
  • 是否可以从 AWS CLI 打开 AWS 管理控制台网站?

    假设我使用特定账户登录到我的 AWS CLI 工具 我可以执行如下命令 aws ecr describe repositories 是否有一个 AWS CLI 命令可以在默认浏览器上打开 AWS 管理控制台网站 并已登录到同一账户 例如 类
  • C 程序中的“原型”是什么?

    我用来学习 C 的书解释了一种叫做 原型 的东西 但我无法正确理解 在书中 以下示例代码解释了这些 原型 这在这里意味着什么 什么是 原型 two func c a program using two functions in one fi
  • AdMob:过滤儿童广告[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我设法在我的 Android 和 iOS 应用程序上运行 AdMob sdk 并且它可以完美地显示广告
  • 在 Visual Studio Express 2010 中无法选择 Main Method 作为启动对象?

    我在我的一个课程中编写了一个 Main 方法 我的启动对象说Not set 单击它时 下拉菜单中不会显示任何其他内容 为什么我不能选择 main 方法作为我的启动对象 我只想通过按 ctrl F7 来运行我的主方法 但这样做时什么也没有发生
  • IIS、Asp.NET 管道和并发性

    我想知道 Web 应用程序中的并发实际上是如何工作的 我读过几篇文章 据我了解 HttpApplication 的多个实例将同时工作 现在 我创建了一个简单的 Web 应用程序来测试并发性 并将以下内容放入 global asax prot
  • 汇编器:为什么存在BCD?

    我知道如果您不了解二进制 BCD 是更直观的数据类型 但我不知道为什么要使用这种编码 它好像没有多大意义 因为它浪费 以 4 位表示 当表示大于 9 时 另外我认为 x86 只支持直接添加和替换 您可以通过 FPU 转换它们 这有可能来自旧
  • 尝试使用 object_getIvar 检索值时 EXC_BAD_ACCESS

    我正在尝试学习如何利用 Objective C 运行时函数 我有一本字典 其中包含几个name value pairs E g recipe description Delicious and healthy recipe id 70423