尝试使用 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 的相关文章

  • iOS 11 浮动 TableView 标题

    有一个应用程序包含多个部分 展开 时每个部分有几行 折叠 时没有 每个部分都有一个部分标题 使用以下子类重用它们UITableViewHeaderFooterView等等 到目前为止一切顺利 然后在 iOS 11 中 我使用了可视化调试器
  • 核心数据:为什么必须调用重新加载数据才能使我的应用程序运行?

    我花了整个晚上调试一个简单的应用程序 该应用程序从网络检索一张图像 是的 是的 旨在让我的生活更轻松 并将其显示在表格视图中 我这样做是为了练习学习核心数据 在我修复它之前 错误消息显示如下 2012 09 30 06 16 12 854
  • 无需 iPhone 6 Plus 即可预览 iOS 应用程序

    我已经在 Yosemite 中使用 iPhone 6 和 Quicktime 完成了 iOS 应用程序预览 视频 但我无法在 iTunes Connect 中为 iPhone 6 上传它 而且我没有 iPhone 6 设备 有没有办法在没有
  • iOS 设置 MKMapView 中心,因此提供的位置位于底部中心

    我有一个 MKMapView 和一个永不改变的 CLLocationCooperative2D 我想做的是将地图居中 以便该坐标将放置在地图的底部中心 我可以用简单的方法将地图集中在这个坐标上 MKCoordinateRegion view
  • 如何修复 ReactiveCocoa(带有 CocoaPods)的安装?

    这里是新手 尝试将 ReactiveCocoa 2 2 4 和 CocoaPods 安装到项目中 但在运行时遇到错误 我用过github 上的这个 podspec https github com CocoaPods Specs blob
  • PhoneGap 1.4 封装 Sencha Touch 2.X - 性能怎么样?

    我正在构建一个多平台平板电脑应用程序 仅使用其 Webview 使用 Phonegap 1 4 对其进行包装 然后使用 Sencha Touch 2 框架发挥我的魔力 我所说的多平台是指 iOS 5 X 和 Android 3 0 目前 到
  • 将语音添加到自定义 UIMenuController

    我创建了一个自定义UIMenuController in a UIWebView但它似乎摆脱了 说出选择 选项UIMenuController在那之后 所有测试设备上的 偏好设置 中都打开了发言选择选项 并且它出现在其他应用程序中 包括非
  • iOS NSURLSession,如何在didCompleteWithError中重试

    我想在我的服务器上尝试一次调用 直到成功为止 我想每 30 秒尝试一次 所以我使用 NSURLSession 进行通话 NSURLSessionDownloadTask task self session downloadTaskWithR
  • ios 11 - UIBarButtonItem 内的 UIButton 导致自动布局错误

    我在将 UIButton 添加到 UIBarButtonItem 时遇到了一个已知问题 我尝试按照建议添加自动布局约束堆栈溢出 https stackoverflow com a 46336639 505603但我收到如下所述的错误 UIB
  • 所有针对 iTunes Connect 的构建,导入此构建时出错 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我将构建上传到应用程序商店 之后它在活动中显示错误 任何人都可以帮帮我 SOLVED 转到构建设置 gt 搜索 bitcode gt 转启
  • 如何从 Firebase 同步检索数据?

    我有两个集合 即用户和问题 根据使用 userId 登录的用户 我检索currQuestion价值来自users收藏 基于currQuestion值 我需要检索question来自 Firebase 的文档Questions收藏 我使用下面
  • Xcode 在代码签名身份中看不到我的开发人员证书

    我续订了 IOS 开发人员证书 从钥匙串中删除了旧证书 然后单击了我的证书 钥匙串中的一切看起来都很正常 我有分发 开发人员 WWDC 证书 每个配置文件看起来都有效 并带有绿色标记 在组织器中的团队和配置文件部分下 但在代码签名身份下的
  • 选择 UITableViewCell 时 UIView 背景颜色消失

    我在界面生成器中构建了一个简单的 tableViewCell 它包含一个包含图像的 UIView 现在 当我选择单元格时 会显示默认的蓝色选择背景 但 UIView 的背景颜色消失了 我的 UITableViewCell 的实现文件没有做任
  • iOS uiwebview 在 WebThread 中崩溃

    我正在寻求一些建议或帮助诊断我所看到的这次崩溃 目前 我认为这可能是一个 webkit 错误 但一切皆有可能 因此请提供您可能有的任何见解 Incident Identifier AEB8EE37 E5D4 4975 97F4 2B2038
  • 如何在 Swift 中使用 CoreBluetooth 更新 BLE 设备的电池电量?

    func peripheral peripheral CBPeripheral didDiscoverCharacteristicsFor service CBService error Error for c in service cha
  • iOS Swift 在后台下载大量小文件

    在我的应用程序中 我需要下载具有以下要求的文件 下载大量 例如 3000 个 小 PNG 文件 例如 5KB 逐个 如果应用程序在后台继续下载 如果图像下载失败 通常是因为互联网连接丢失 请等待 X 秒然后重试 如果失败Y次 则认为下载失败
  • 带约束的嵌套集合视图的意外行为 (Swift 4)

    我的表格视图中有一个单元格 其中包含水平分页集合视图 该集合视图的每个页面内都有一个垂直集合视图 为了避免 滚动滚动 问题 我在垂直集合视图中禁用了垂直滚动 垂直集合视图的单元格计数不是静态的 可以是任意数字 因此 这会产生一个问题 集合视
  • NSURLCache 不缓存

    我正在使用 Xcode 6 1 6A1030 iOS7 和 iOS8 模拟器 NSURLCache 似乎没有缓存任何东西 我使用 Cache Control 标头 我的服务器返回带有 max age 6000 的 Cache Control
  • removeItemAtPath 完成

    我正在以这种方式删除路径上的文件 UIPanGestureRecognizer gesture UIPanGestureRecognizer sender UIButton button UIButton gesture view UIPa
  • XCode 7 中的 AWSS3TransferManagerUploadRequest

    我今天升级到 Xcode 7 Swift 2 0 我的项目正在使用 CocoaPods 我正在 POD 文件中导入所有与 AWS 相关的文件 我已经设置了桥接标头 并导入了 Amazon 告诉我的所有文件 在升级到 Swift 2 0 之前

随机推荐

  • 我在 .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