为什么 objc_msgSend 会导致 EXC_BAD_ACCESS?

2024-03-25

我正在上一堂课,给出了object目标,一个selector观察,以及displayTitle将输出以下格式的字符串:@"displayTitle: object.selector"。然后它通过 KVO 注册自己,以便任何时候value of object.selector更改时,它可以通知视图控制器更新视图。我使用它作为一种抽象且可重用的方式来向用户显示对象的各种属性的描述。

当我尝试获取的值时object.selector,我做不到[object performSelector:selector]因为当您将 PerformSelector 与动态选择器一起使用时,LLVM 会出现错误 https://stackoverflow.com/questions/7043999/im-writing-a-button-class-in-objective-c-with-arc-how-do-i-prevent-clangs-m。 所以,我确实做了什么这个答案 https://stackoverflow.com/a/7073899/2564682建议:我用过objc_msgSend(object, selector).

- (instancetype)initWithSelector:(SEL)selector onObject:(NSObject*)object displayTitle:(NSString*)displayTitle {
    self = [super init];

    if (self) {
        id value;

        if ([object respondsToSelector:selector) {
            // Used objc_msgSend instead of performSelector to suppress a LLVM warning which was caused by using a dynamic selector.
            value = objc_msgSend(object, selector);
        } else {
            return nil;
        }

        [self setItemDescription:[NSString stringWithFormat:@"%@: %@", displayTitle, value]];
    }

    return self;
}

我得到了一个EXC_BAD_ACCESS!

正如你在屏幕截图中看到的,我确保 正在做[object selector] works.

这是怎么回事?我该如何解决?


你分配你的结果objc_msgSend调用类型变量id因此 ARC 启动并尝试保留生成的对象(崩溃发生在objc_retain正如您在左侧堆栈中看到的那样)。然而,结果不是一个对象,而是一个值为 8 的整数,即objc_retain需要成为一个指针。但是没有这么低的有效指针,所以你得到EXC_BAD_ACCESS.

只需更改类型即可value to be NSUInteger(或任何其他非对象类型)。但要确保所有潜力selectors 返回相同类型的数据。或者,确保始终返回一个对象(或nil),可以由 ARC 保留。

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

为什么 objc_msgSend 会导致 EXC_BAD_ACCESS? 的相关文章

  • 如何获取未知大小 NSArray 的前 X 个元素?

    在 ObjectiveC 中我有一个 NSArray 我们称之为NSArray largeArray 我想要一个新的NSArray smallArray仅包含前 x 个对象 或者如果largeArray 的大小已经 这种方法 NSArray
  • 从 CocoaPods 添加 pod 时,架构 x86_64 的重复符号

    我正在尝试使用谷歌分析 https developers google com analytics devguides collection ios v3 进入我的应用程序 但通过 CocoaPod 添加后立即收到此错误 以前我的 Pod
  • 如何从 Swift 调用 Objective-C 代码?

    在 Swift 中 如何调用 Objective C 代码 Apple 提到它们可以在一个应用程序中共存 但这是否意味着在技术上可以重用 Objective C 中创建的旧类 同时在 Swift 中构建新类 在 Swift 中使用 Obje
  • iPhone应用程序崩溃错误访问异常DataDetectorsCore processToken

    我的 iPhone 应用程序在客户端设备上的 ios 7 0 iphone 5s 上崩溃 我无法弄清楚它出了什么问题 我正在使用 crashlytics 进行崩溃报告 Crashlytics 报告由于线程 9 DataDetectorsCo
  • 如何降低iphone的sdk Audioqueue的声音?

    我正在使用 Aran Mulhollan 的 RemoteIOPlayer 在 SDK iphone 中使用音频队列 我可以毫无问题 添加两个信号来混合声音 通过乘以从 wav 文件中获得的 UInt32 来增加音量 但所有其他操作都会给我
  • 如何在 UILabel.text 中添加制表符空间

    我有一个 UILabel 实例 比如 mylabel 我想做的是这样的 mylabel text Age tLimit tYear instead of mylabel text Age Limit Year 但当我尝试时 t 未被识别 如
  • 将 NSDecimalNumber 转换为 NSString

    我正在从如下所示的对象中检索密钥 po obj TypeID 3 TypeName Asset 键值的检索方式如下 NSString typeId NSString obj objectForKey TypeID typeId 不是 NSS
  • 动态增加UITableViewCell中UILabel的高度?

    我有一个 UITableView 其中显示一个自定义单元格 我的单元格有两个标签和一个视图 如下图所示 我已经像这样给出了左视图的约束 项目标签限制 中心视图约束 右视图的约束 I am using a bean class to stor
  • 循环缓冲区录音 iOS:可能吗?

    我的一个客户想要连续录制音频 当他单击 提交 时 他只想提交最后 10 秒的内容 所以他想要连续记录并且只保留最后 x 秒 我认为这需要类似循环缓冲区的东西 但是 作为 iOS 的新手 它看起来像AVAudioRecorder只能写入文件
  • iOS App Today 扩展未上传到物理设备

    我正在为我的应用程序创建一个今日小部件http budgt ch http budgt ch因为一些用户要求快速访问关键功能 初步 扩展在 iOS 模拟器上运行良好 安装如下 1 安装最新的容器应用程序 2 安装以 今天 为容器的扩展 但是
  • 如何在iPhone应用程序中的类结构中实现主键和外键表数据[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何连接sqlite数据库中的两个表数据 if sqlite3 open dbPath UTF8String database SQL
  • UIButton 图像未更改/更新

    首先 我对 Objective C 还很陌生 并且仍在尝试尽可能多地学习 所以请耐心等待 现在我有一个以编程方式创建的 UIButton 按下按钮时 将显示一个 UIActionSheet 其中包含 相机 选择照片 或 取消 选项 然后 按
  • NSMutableArray 实例变量内存管理

    我正在做最后一点内存管理整理 但有些东西我不明白 我已经检查了所有文档 Stack Overflow 等 但仍然不明白 我怀疑这与数组有关 我有一个NSMutableArray作为实例变量 我用它来保存从另一个数组中的对象创建的对象 vie
  • NSDictionary 上的 NSPredicate

    我试图根据字母表在表格视图中创建部分 并在这些部分下按字母顺序对我的条目进行排序 我已经收集了 bandArrayIndex 中 bandArray 每个条目的第一个字母 现在我尝试使用 NSPredicate 来计算每个字母有多少个 我正
  • 如何在 NSMutableArray 中实现“按值分组”?

    我正在使用 NSMutableArray 我想像在 SQL 中那样按日期获取值group by log date logMuArray log currenttime 4 30pm log date 11 12 2011 log durat
  • 如何使用 iPhone SDK 实现可滑动的图像堆栈(例如照片应用程序)?

    我想获取一堆图像 或者可能是一组用于下载图像的 URL 并以全屏方式显示它们 一次一个 使用 iPhone SDK 使用用户滑动来平滑地为堆栈中的下一个图像设置动画 Apple 的 Photo app 似乎可以做到这一点 此外 如果尚未检索
  • 如何在 iOS 9 上可靠地检测是否连接了外部键盘?

    在 iOS 9 之前 确定是否连接外部键盘的最可靠方法是监听UIKeyboardWillShowNotification并使文本字段成为第一响应者 如中所述这个问题 https stackoverflow com questions 289
  • 如何将 UILabel 的值绑定到实例变量?

    我是 mac objective c 的新手 我的问题是 我想知道是否可以将 UILabel 文本绑定到变量 而不必在值更改时手动设置文本 例如 在 Mac OS 上 当我打开新的 Finder 窗口并删除文件时 任务栏中的全局可用空间就会
  • 水平 UICollectionView 单行布局

    我正在尝试使用以下命令设置简单的水平布局UICollectionView 兜圈子却没有达到预期的结果 所以任何指针或例子将不胜感激 我粘贴经常更改的代码但没有成功可能没什么意义 该图像显示两行 第一行是单个项目 尺寸正确并且在中心正确对齐
  • 在 UIScrollview 上显示缩略图的最佳方法是什么(从服务器下载)

    我想在 UIScrollview 如照片应用程序 上显示许多图像 作为缩略图 所有图像将从服务器下载 据我所知 有几种选择 1 通过创建 UIImageviews 然后将它们添加为主滚动视图上的子视图 2 通过子类化一个UIView类 然后

随机推荐