【发布时间】:2015-04-12 00:04:31
【问题描述】:
在 Apple 发布 iOS 8.3 之前,我的代码可以运行,但是由于更新的 XCode 抱怨找到了一个 nil 值,即使我的值都不是 nil(我在调试时验证了这一点)。
出于理智,我重新编写了我的程序以使用 Metal 在屏幕上渲染一个简单的三角形,但抛出了同样的错误。我有一个包含 3 个顶点的数组,然后将其乘以数组大小以获得缓冲区的大小并传入 OptionCPUCacheModeDefault,因为我认为传递 nil 参数可能是导致我的问题的原因。
// Test array of vertices
let ASVertices:[Float] = [
0.0, 1.0, 0.0,
-1.0, -1.0, 0.0,
1.0, -1.0, 0.0
]
// Other Metal init code...
// Set the buffers
let dataSize = ASVertices.count * sizeofValue(ASVertices[0])
vertexBuffer = ASDevice.newBufferWithBytes(ASVertices,
length: dataSize,
options: MTLResourceOptions.OptionCPUCacheModeDefault)
当我调试时,我可以看到 dataSize 符合预期是 36 (9*4),所以我很难理解为什么我会得到 fatal error when unwrapping an optional value。我知道错误是不言自明的,但上面打印的代码是堆栈跟踪显示引发异常的地方,但我在那里看不到 nil 值。这可能是什么原因造成的?
【问题讨论】:
-
不相关的注释,
ASVertices应该是asVertices- 按照约定,变量以小写字母开头。类和类型以大写字母开头。 A 对于您崩溃的实际原因,您是否尝试过单步执行以查看故障发生在哪里? Swift 因给出误导性异常位置而臭名昭著 -
不,只是顶点。 AS 是前缀,不是 Swift。