为啥 SKProductsRequestDelegate/SKRequestDelegate didFailWithError 在 NSError 上抛出 EXC_BAD_ACCESS?

Posted

技术标签:

【中文标题】为啥 SKProductsRequestDelegate/SKRequestDelegate didFailWithError 在 NSError 上抛出 EXC_BAD_ACCESS?【英文标题】:Why SKProductsRequestDelegate/SKRequestDelegate didFailWithError throws EXC_BAD_ACCESS on NSError?为什么 SKProductsRequestDelegate/SKRequestDelegate didFailWithError 在 NSError 上抛出 EXC_BAD_ACCESS? 【发布时间】:2016-06-01 12:04:15 【问题描述】:

我使用SKProductsRequest 从 App Store 下载产品信息。 当我在我的设备上测试连接丢失时,请求失败,但是当我尝试 NSLog 错误时,我的应用程序在 SKRequestDelegate 内崩溃:

我做错了什么?另一个让我好奇的是,Expression Inspector 能够显示NSError.debugDescription...

它在第一次请求时失败,因此对于 productRequest 变量的多次使用没有可能的错误(这是我的 swift 类中的强引用)。

【问题讨论】:

【参考方案1】:

我终于找到了原因。与SKProductsRequest无关!

我认为NSLog 和字符串插值存在一个讨厌的错误,因为当我替换时:

NSLog("Failed: \(error.debugDescription)")

通过

print("Failed: \(error.debugDescription)")

一切都好!

显然,错误消息的内容会在 NSLog 中引发 EXC_BAD_ADDRESS(即使实际上没有字符串插值:NSLog(error.debugDescription) 也会失败)。


相关回复:https://***.com/a/29631505/249742

NSLog("%@", error.debugDescription)

似乎在任何情况下都可以正常工作。

也许NSLog(variable) 是对NSLog 的误用,但我认为NSLog(\(variable)) 应该被解释为NSLog("%@", variable)。否则,没有可靠的方法可以使用 NSLog 快速方式 \() 插入字符串。

【讨论】:

以上是关于为啥 SKProductsRequestDelegate/SKRequestDelegate didFailWithError 在 NSError 上抛出 EXC_BAD_ACCESS?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?