Objective-C - ARC - NSNumber - 分段错误

2024-05-26

我有一个 Objective-C 程序,并且正在使用 ARC(自动引用计数),它在第 23 行抛出分段错误(请参见下面的程序)。

Question1)为什么会出现分段错误?

下面给出的是程序:

#import<Foundation/Foundation.h>

@interface Car : NSObject
@property (weak) NSNumber* doors;
@end

@implementation Car 
@synthesize doors;
@end

int main()
{
    system("clear");

    @autoreleasepool
    {    
        Car *car1 = [[Car alloc] init];

        printf("1\n");
        NSNumber *d1 = [[NSNumber alloc] initWithInteger: 4]; 

        printf("2\n");
        car1.doors = d1;   //Segmentation fault.. why ?

        printf("3\n");
    }   

    printf("---- end\n");

    return(0);
}

Output:

1
2
Segmentation fault: 11

恭喜:您在 Core Foundation 中发现了一个错误!

正如比尔怀疑的那样,这与Lion 中的标记指针 http://objectivistc.tumblr.com/post/7872364181/tagged-pointers-and-fast-pathed-cfnumber-integers-in。当你创建时

NSNumber *d1 = [[NSNumber alloc] initWithInteger: 4];

d1并不指向实际的NSNumber实例。反而,d1是一个标记指针,包含0x4c3, where 0x4是标记指针中的有效负载。

当您尝试使用标记指针作为弱属性的值时,Objective-C 运行时执行的步骤之一是发送-allowsWeakReference到实例来验证它是否可以用作弱引用。自从NSNumber不重写该方法,默认实现NSObject被执行,依次发送_isDeallocating,这又调用_CFIsDeallocating()如该堆栈跟踪所示:

#0  0x00007fff8ccdbacd in _CFIsDeallocating ()
#1  0x00007fff8ccd3119 in -[__NSCFNumber _isDeallocating] ()
#2  0x00007fff8be34b15 in -[NSObject(NSObject) allowsWeakReference] ()
#3  0x0000000100000ded in main () at test.m:12

如果你读过CFRuntime.c http://www.opensource.apple.com/source/CF/CF-635/CFRuntime.c,你会看到_CFIsDeallocating()将相应的指针转换为CFRuntimeBase *为了阅读_cfinfo。对于普通的 Core Foundation 对象,这是有效的,因为每个常规 Core Foundation 引用都指向一个以isa指针,后跟_cfinfo。但是,标记指针并不指向实际(分配的)内存,因此_CFIsDeallocating()尝试取消引用无效的指针,从而导致分段错误。

你应该向 Apple 提交错误报告 http://bugreport.apple.com。同时,使用strong or unsafe_unretained财产。


Edit:要获取回溯,请使用以下命令构建可执行文件-g包含调试信息,例如:

$ clang test.m -g -fobjc-arc -framework Foundation -o test

并使用 GDB 运行它:

$ gdb test
…
(gdb) run

程序会崩溃:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00000000000004cb
0x00007fff8ccdbacd in _CFIsDeallocating ()

Use the btGDB 中获取回溯的命令:

(gdb) bt
#0  0x00007fff8ccdbacd in _CFIsDeallocating ()
#1  0x00007fff8ccd3119 in -[__NSCFNumber _isDeallocating] ()
#2  0x00007fff8be34b15 in -[NSObject(NSObject) allowsWeakReference] ()
#3  0x00007fff875173a6 in weak_register_no_lock ()
#4  0x00007fff875179f9 in objc_storeWeak ()
#5  0x0000000100000c0e in -[Car setDoors:] (self=0x100113f60, _cmd=0x100000e7a, doors=0x4c3) at test.m:8
#6  0x0000000100000d45 in main () at test.m:23

然后是quit退出GDB的命令:

(gdb) quit

在 Xcode 中,使用 Mac OS X > 应用程序 > 命令行工具模板。当你运行你的程序时,Xcode应该自动在调试区域显示GDB提示符。如果调试区域未显示在标准编辑器中,请选择“视图”>“调试区域”>“显示调试区域”。


Edit:此错误已在 OS X v10.7.3 中修复。

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

Objective-C - ARC - NSNumber - 分段错误 的相关文章

  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 如何在发布期间复制未版本化的测试资源:执行?

    我的问题与 Maven 在发布时不会复制未跟踪的资源 https stackoverflow com questions 10378708 maven doesnt copy untracked resources while releas
  • 如何确定所有角度2分量都已渲染?

    当所有 Angular2 组件完成渲染时 是否会触发一个角度事件 For jQuery 我们可以用 function 然而 对于 Angular2 当domready事件被触发 html 只包含角度组件标签 每个组件完成渲染后 domrea
  • TIFF 元数据的最大大小是多少?

    TIFF 文件元数据的单个字段中可以合并的元数据数量是否有最大限制 我想在 ImageDescription 字段中存储大文本 最多几 MB 没有具体的最大限制ImageDescription但是 整个 TIFF 文件存在最大文件大小 该最
  • 如何从日期中查找该月的最后一天?

    如何在 PHP 中获取该月的最后一天 Given a date 2009 11 23 我要2009 11 30 并给出 a date 2009 12 23 我要2009年12月31日 t返回给定日期所在月份的天数 请参阅的文档date ht
  • Redis如何存储关联数组?设置、散列还是列表?

    我对 Redis 的所有可用存储选项有点困惑 我想做一些简单的事情 并且不想过度设计它 我正在与phpredis and Redis v2 8 6 我有一个需要存储的简单关联数组 我还需要能够通过其键检索项目并循环遍历所有项目 a arra
  • PHPUnit 和 Zend Framework assertRedirectTo() 问题

    我在创建的测试中遇到了 assertRedirectTo 问题 下面是我使用的代码 public function testLoggedInIndexAction this gt dispatch this gt assertControl
  • 如何使用asm.js进行测试和开发?

    最近我读到asm js规范 看起来很酷 但是是否有任何环境 工具来开发和测试这个工具 这还只是处于规范阶段吗 您可以尝试使用 emscripten 和 ASM JS 1 并从侧分支在 firefox 构建中运行它 有关 asm js 的链接
  • CSS溢出文本显示在几行中,没有断字

    我有一些长文本显示在 div 中 该 div 具有固定的宽度和高度 我希望文本显示在几行上 作为 div 高度 并且句子单词不会中断 一行中的单词前缀和下一行中的继续 此外 我想在末尾添加省略号最后一句话 CSS white space n
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个
  • 循环内的异步性

    我正在使用 jQuery getJSON 用于从一组实用程序的给定 URL 检索数据的 API 我真的很想找到一种为每个实用程序重用代码 完全相同 的方法 由于循环的执行与 ajax 调用无关 因此我无法找到保留循环值的方法 我知道这个描述
  • rspec 中的模拟方法链

    有一系列方法可以获得user目的 我试图模拟以下内容以返回user in my Factory Girl current user AuthorizeApiRequest call request headers result 我可以模拟该
  • Erlang dict的时间复杂度

    我想知道 Erlang OTP 是否dict模块是作为哈希表实现的 在这种情况下它是否能提供这样的性能 平均情况 Search O 1 n k Insert O 1 Delete O 1 n k 最坏的情况下 Search O n Inse
  • 升级到 Rails 6 时是否有一种编程方法可以检测 Zeitwerk::NameError?

    我目前正在将旧的 Rails 应用程序迁移到 Rails 6 好像项目中有些文件和里面定义的类不一致 运行应用程序测试时我没有看到此错误 但部署后我收到如下错误 Zeitwerk NameError expected file app my
  • 在 Nexus 7 2013 上更改方向时 CSS 媒体查询不起作用

    我目前正在我的笔记本电脑 台式电脑和 Nexus 7 2013 上测试 CSS 媒体查询 除了 Nexus 7 之外 它们在台式机和笔记本电脑上都运行良好 当我更改方向时 除非刷新页面 否则样式不会应用 例如 以纵向模式握住设备时 页面正常
  • 如何在react-highcharts中使用图表工具提示格式化程序?

    如何使用图表工具提示格式化程序 我正在使用高图表的反应包装器 我有这样的配置 const CHART CONFIG tooltip formatter tooltip gt var s b this x b each this points
  • 强制 Listview 不重复使用视图(复选框)

    我做了一个定制Listview 没有覆盖getView 方法 Listview 中的每个项目都具有以下布局 联系布局 xml

随机推荐

  • 在单独的终端屏幕上显示 git diff 和 git log 输出

    设置新的开发环境后 我遇到了一个奇怪的 git 行为 我不记得过去见过 我习惯于git diff and git log在终端中创建一个新屏幕并在其中显示其输出 什么less默认情况下 我用它作为我的寻呼机 然后我可以退出并返回到之前的终端
  • Fortran的性能

    Fortran 的表现计算机语言基准游戏 http shootout alioth debian org 出奇的糟糕 今天的结果显示 Fortran 在两项四核测试中分别排名第 14 和第 11 在单核测试中排名第 7 和第 10 现在 我
  • 管道 - 将多个来源/生产者合并为一个

    我正在使用读取文件sourceFile 但我还需要在处理操作中引入随机性 我认为最好的方法是拥有一个这样的制片人 Producer m StdGen ByteString 其中 StdGen 用于生成随机数 我打算让生产者执行 source
  • Elasticsearch:带有停用词消除功能的带状疱疹

    我正在尝试实现一个 Elasticsearch 映射来优化大量文本中的短语搜索 根据中的建议本文 http www elasticsearch org blog searching with shingles 我使用 shingle 过滤器
  • 有没有办法创建与元素不同的盒子阴影形状?

    当我将鼠标悬停在复选框输入上时 我尝试在复选框输入上创建圆形框阴影 但它采用元素的形状 如何将框阴影的形状更改为圆形
  • 将变量作为 IIFE 中的属性返回

    我试图在 IIFE 初始化后返回一个变量集作为属性 问题是 如果我直接绑定变量 我会得到一个空对象 如果我通过函数绑定它 我就会得到我想要的结果 var Application function var localInformation f
  • eBay API 调用不适用于 UPC/EAN

    eBay 的 API findItemsByProduct 操作适用于 UPC 和 EAN 但不幸的是它不起作用 例如 下面的 HTTP GET 请求会抛出 无效的产品 ID 值 错误41 Note 请将 SECURITY APPNAME
  • 发送带有附件的 PHP HTML 邮件

    我遇到了一个问题 直到今天 我使用 PHP 发送 HTML 电子邮件 其中包含的标头 Content type text html 现在 我添加了添加附件的功能 为此 我必须将此行更改为 Content Type multipart mix
  • 应该有 还是 应该有

    我正在读马克 皮尔格姆的 深入研究 HTML5 http www diveintohtml5 net semantics html 并且在语义部分 http www diveintohtml5 net semantics html new
  • WebView 的自定义用户代理

    我可以为一个设置自定义用户代理吗WebView 我需要展示网站的移动风格 这很容易做到 string ua Mozilla 5 0 iPhone CPU iPhone OS 6 0 like Mac OS X AppleWebKit 536
  • Python daysBetweenDate

    我想我可能有一个无限循环 因为每当我运行代码时 我都会收到一条错误消息 它说 程序因使用 13 CPU 秒而关闭 整个代码 应该以日期作为输入并输出第二天 此代码假设所有月份都是 30 天 除了daysBetweenDates功能正常 其他
  • Spark Workers 上缺少 SLF4J 记录器

    我正在尝试通过以下方式运行工作spark submit 此作业导致的错误是 Exception in thread main java lang NoClassDefFoundError org slf4j Logger at java l
  • 使用连接字段的 SQL JOIN

    我有两个表 Table1 包含一列 该列构成 Table2 中列的部分值 例如 表1 XName 123456 表2 ZName ABC 123456 我需要创建一个与这些匹配的 JOIN 但是使用 MS SQL 2008 我在完成这项工作
  • log4j2 SMTP Appender:如何包含另一个级别的先前消息?

    我正在使用 log4j2 beta9 并且有以下配置 其中一部分
  • 调用另一个 PHP 脚本并在其他脚本完成之前将控制权返回给用户

    我实际上正在尝试将其应用于发送电子邮件的脚本 发送电子邮件部分需要几秒钟 这太长了 我想要的是第一个脚本执行其操作并触发另一个脚本 发送电子邮件 但我希望第一个脚本将控制权返回给用户 而无需等待第二个脚本发送电子邮件 我考虑过的选项 计划任
  • Azure Active Directory 不会使用 ASP.NET Core 2.1 MVC 注销

    我有一个 ASP NET Core 2 1 MVC 应用程序 我正在尝试使用 Azure AD 进行身份验证 该应用程序重定向到 Microsoft 登录页面 但当我注销然后返回到应用程序的主页时 它会自动重新登录 我试过打电话https
  • LineSpace 如何影响单行文本中的 StaticLayout 高度

    考虑这个简单的例子 我有这样的单行文本 你好 我想使用 StaticLayout 来测量这个文本 所以我写了这样的东西 StaticLayout layout new StaticLayout Hello myTextView getPai
  • 在 JavaScript 中使用随机数创建长度为 n 的数组

    跟进这个答案 https stackoverflow com a 34693778 1525840为了创建指定长度的数组 我执行了以下命令以获得相应的结果 但填充了随机数 而不是零 var randoms Array 4 fill Math
  • 是否可以创建一个包含多页 tiff 文件所有帧的 base64 字符串?

    使用已知的转换方法将多页 tiff 文件转换为 base64 字符串似乎只包含其中的一个页面 我从本地磁盘获取多页 tiff 文件 Image multiPageImage Image FromFile fileName 将其转换为 bas
  • Objective-C - ARC - NSNumber - 分段错误

    我有一个 Objective C 程序 并且正在使用 ARC 自动引用计数 它在第 23 行抛出分段错误 请参见下面的程序 Question1 为什么会出现分段错误 下面给出的是程序 import