Xcode 升级到 4.5 后应用程序崩溃。将保留对象分配给 unsafe_unretained 变量

2024-04-19

在我的班级里,我有一个dispatch_queue_t属性声明如下:

@property (nonatomic, assign) dispatch_queue_t queue;

然后在我的 init 方法中我这样做:

- (id)initWithServerUrls: (NSString*)serverUrls
{
    if (self = [super init])
    {
        _queue = dispatch_queue_create("com.xxx.my_send_queue", DISPATCH_QUEUE_SERIAL);
    }

    return self;
}

在 Xcode 4.4.1 中它可以工作并且没有引起任何问题(该应用程序在应用程序商店中进行了测试+)。 现在,在我升级到 Xcode 4.5 后,应用程序崩溃了EXC_BAD_ACCESSXcode 在该行给了我一个警告:

将保留对象分配给 unsafe_unretained 变量;对象在赋值后会被释放

Apple 将 Xcode 4.5 中的编译器从 LLVM 4.0 更新到 LLVM 4.1,但我不知道为什么我的代码现在崩溃了。

我单步执行了代码,崩溃发生在该行之后。 您知道可能出现什么问题以及如何解决它吗?

解决方案:

我设法让它与两个 SDK 一起工作。我刚刚补充道:

#if OS_OBJECT_USE_OBJC
@property (nonatomic, strong) dispatch_queue_t queue; // this is for Xcode 4.5 with LLVM 4.1 and iOS 6 SDK
#else
@property (nonatomic, assign) dispatch_queue_t queue; // this is for older Xcodes with older SDKs
#endif

希望有人觉得它有用


首先,如果您的目标平台是 5+,那么我强烈建议使用 iOS 5 SDK 进行构建。使用更高版本的 SDK 进行构建并设置“目标”可以工作,但会出现很多问题(其中最重要的是,您无法获得编译器帮助来查找使用了不受支持的方法的位置)。所以答案 1:你需要 iOS 5,针对 iOS 5 进行构建,这应该不重要。

在 iOS 6 中,dispatch_queue_t是一个 ObjC 对象。这是一个很大的进步。这意味着您可以创建strong它的属性和 ARC 将处理其余的事情。如果您的目标是 iOS 6,这应该可以正常工作。

如果您需要为 iOS 5 和 iOS 6 构建相同的代码,那么您需要知道哪个是哪个,以便您可以在需要时放入内存管理,在不需要时将其忽略。使用的正确测试是#if OS_OBJECT_USE_OBJC。请记住,这是一个编译时查看。它仅适用于处理您要针对不同 SDK 编写的代码。对于给定的 SDK,行为可能是其中之一。

关于“unsafe_unretained”与“分配”的混淆:在这种情况下它们是同一件事。 “分配”仅适用于非对象。 “unsafe_unretained”是“分配”应用于对象时转换为的内容。而在iOS6中,dispatch_queue_t是一个对象。

另一种解决方法,特别是如果您确实想在使用 iOS 6 SDK 构建时保留旧的内存管理代码。你可以通过-DOS_OBJECT_USE_OBJC=0给编译器。这将选择退出新模型。但我建议将此作为最后的手段。详细信息请参见os/object.h在 SDK 中。 (Cmd-Shift-O,object.h)

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

Xcode 升级到 4.5 后应用程序崩溃。将保留对象分配给 unsafe_unretained 变量 的相关文章

  • UISlider不会自动重绘

    我的应用程序上有一个 UISlider 有时我不仅需要更新它的值 还需要更新它的minimumValue 值已更改 但如果我调用 setValue 方法或为滑块分配新值 它会具有新值 但滑块不会将自身重新绘制到该新值应有的位置 我怎样才能重
  • 在 UITextView 中获取 HTML

    我在中显示htmlUITextView by self textView setValue b Content b forKey contentToHTMLString 编辑内容后UITextView 我想获取包含 html 的内容 所以我
  • 使用特定的 url 启动 UIWebview

    我目前有一个包含四个按钮的视图 并且希望能够启动 UIWebview 并为每个不同的按钮提供特定的 url 我目前可以使用 url 从外部启动 safari 我知道我可以使用代码在每个按钮中显示 UIWebview 并且可以在 UIWebv
  • SceneKit unproject Z 文档解释?

    我正在经历一些 SceneKit 概念 而我试图在脑海中巩固的一个概念是 unprojectPoint 我知道该函数将获取 2D 中的一个点并返回 3D 中的一个点 因此具有正确的 Z 值 当我阅读文档时 我读到了以下内容 method u
  • 是否可以使用UIPageControl来控制UITableView的移动?

    从Apple示例 PageControl 中我们可以知道UIPageControl可以用来控制scrollview中页面的移动 由于 UITableView 是 UIScrollView 的子类 我想使用 UIPageControl 来控制
  • MKMapView 拦截/劫持 iPhone 触摸事件

    3 0 SDK 是否存在禁用实时缩放并拦截 MKMapView 放大手势的 bug 我有一些真正简单的代码 因此我可以检测点击事件 但有两个问题 放大手势始终被解释为缩小手势 所有缩放手势都不会实时更新地图视图 在 hitTest 中 如果
  • 带约束的嵌套集合视图的意外行为 (Swift 4)

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

    我想将一个 Segue 从我的视图控制器拖到其自身 所以我可以推送该特定视图控制器的 无限 实例 我知道如何在代码中执行此操作 即以编程方式实例化视图控制器 但是 我想尽可能使用 segues 我发现了一些在故事板中进行自我延续的 技巧 但
  • 将 Armadillo C++ 库导入 Xcode

    我是 Mac 用户 正在尝试安装和导入 C Armadillo 库 以下是我到目前为止所采取的步骤 1 我从其网站下载了犰狳库 2 我仔细阅读了下载文件中的 Readme txt 文件 解释了如何安装它 3 我使用CMake将犰狳下载文件制
  • iPhone SDK中的短信正文

    我需要从我的 iPhone 应用程序发送短信 SMS 的正文是以编程方式创建的 因此 当我点击按钮时 短信应用程序应该打开 并在其中预先输入我的消息 有人知道怎么做吗 需要帮忙 提前致谢 世宾 您无法设置短信正文 根据官方 SDK 您可以从
  • 默认情况下在 MPMovies PlayerViewController 中显示字幕

    有什么方法可以在默认情况下由 MPMovies PlayerViewController 加载的电影上显示字幕吗 这部电影在视频中嵌入了字幕 谢谢你 不幸的是 这个功能在MPMoviePlayer播放类 这显然相当烦人 您应该考虑向 App
  • Swift:协议、结构、类

    我开始学习 Swift 语言 但在理解协议 结构和类方面遇到了困难 我来自 Android 方面的编程 所以我相信 Swift 协议基本上是 Java 接口 其中每一个的正确用例是什么 这些类比并不 完全 正确 但这就是我所理解的要点 是的
  • 在 Swift 中以编程方式为 iOS 制作带有名字首字母的图像,例如 Gmail

    我需要在 UITableView 中显示与其姓名相对应的每个用户的个人资料图片 在下载图像之前 我需要显示一张带有他名字的第一个字母的图像 就像在 GMail 应用程序中一样 如何在 Swift for iOS 中以编程方式执行此操作 不需
  • 带有 allowedEditing 的 UIImagePickerController 不允许平移裁剪

    我在这里看到这个问题 UIImagePicker 允许编辑卡在中心 https stackoverflow com questions 12630155 uiimagepicker allowsediting stuck in center
  • UILabel 中的文本未垂直居中

    我使用以下代码创建了一个标签 func setupValueLabel valueLabel numberOfLines 1 valueLabel font UIFont name Avenir Black size 50 valueLab
  • cordova插件条码扫描仪打不开扫描

    我的条形码扫描仪插件有问题 我不是天才 我不太了解如何编写网络应用程序 我使用phonegap和cordova 并且尝试制作一个网络应用程序 在单击链接后扫描条形码 我之前已经使用此命令行安装了该插件 cordova plugin add
  • 当 ViewController 从 UIStoryboard 实例化时,isMemberOfClass 返回 no

    我有一个 OCUnit 测试类 PatientTestViewControllerTests 下面是界面 interface PatientTestViewControllerTests SenTestCase property nonat
  • 无需越狱即可检测iOS9上哪个应用程序处于前台

    我正在尝试记录用户在 iOS9 上的个人应用程序使用情况 我宁愿它不会使用越狱有限的解决方案 不言自明 在越狱手机上执行此应用程序的变体应该不难 https www andyibanez com create mobilesubstrate
  • 如何观察UserDefaults的变化?

    我有一个 ObservedObject在我看来 struct HomeView View ObservedObject var station Station var body some View Text self station sta
  • 游戏中心邀请处理程序,它属于哪里?

    我已经搜索了该网站并发现了这个 GameCenter 邀请处理程序 https stackoverflow com questions 4639284 gamecenter invitation handler He says 正如文档中所

随机推荐