Swift 在用于OpenGL纹理的CGContext上调用draw函数时,为什么会出现错误的_访问错误?

Swift 在用于OpenGL纹理的CGContext上调用draw函数时,为什么会出现错误的_访问错误?,swift,macos,core-graphics,exc-bad-access,opengl-3,Swift,Macos,Core Graphics,Exc Bad Access,Opengl 3,我正在尝试使用核心图形创建OpenGL纹理。我的代码设置在prepareOpenGL()中。当绘制到初始化的CGContext时,我得到一个EXC\u BAD\u ACCESS故障。但是,当我在LLDB中订购上下文时(pocontext!,请参见下文),我会得到一个包含所有CGContext信息的地址。我也尝试过通过LLDB调用一个表达式,结果是nil。地址消毒剂、线程消毒剂和僵尸都没有暴露。我的问题是,当可选的不是nil时,为什么CGContext被声明为nil,EXC\u BAD\u ACC

我正在尝试使用核心图形创建OpenGL纹理。我的代码设置在
prepareOpenGL()
中。当绘制到初始化的
CGContext
时,我得到一个
EXC\u BAD\u ACCESS
故障。但是,当我在LLDB中订购上下文时(
pocontext!
,请参见下文),我会得到一个包含所有CGContext信息的地址。我也尝试过通过LLDB调用一个表达式,结果是
nil
。地址消毒剂、线程消毒剂和僵尸都没有暴露。我的问题是,当
可选的
不是
nil
时,为什么CGContext被声明为nil,
EXC\u BAD\u ACCESS
?我曾尝试在
drawRect(:)
中调用此代码,但得到了相同的结果

导入可可粉
导入核心图形
导入OpenGL.GL3
类MyView:NSOpenGLView{
var textureTBO:GLuint=0
重写函数prepareOpenGL(){
设bitmapRows=10
设bitmapColumns=10
设floatsPerPoint=4
var bitmapBuffer=UnsafemeutablePointer.allocate(容量:bitmapRows*bitmapColumns*floatsPerPoint)
如果let context=CGContext(数据:&bitmapBuffer,
宽度:位图列,
高度:位图行,
比特组件:8,
bytesPerRow:bitmapColumns*floatsPerPixel,
空格:CGColorSpaceCreateDeviceRGB(),
bitmapInfo:CGImageAlphaInfo.noneSkipLast.rawValue){
setFillColor(红色:0,绿色:0,蓝色:1,alpha:0.5)
context.fill(CGRect(x:0,y:0,宽度:5,高度:5))/=>EXC\u BAD\u访问,代码=2
setFillColor(红色:1,绿色:0,蓝色:1,alpha:0.5)
填充(CGRect(x:5,y:5,宽度:5,高度:5))
setFillColor(红色:0,绿色:1,蓝色:0,alpha:0.5)
填充(CGRect(x:0,y:5,宽度:5,高度:5))
setFillColor(红色:0.5,绿色:0,蓝色:0.5,alpha:0.5)
填充(CGRect(x:5,y:0,宽度:5,高度:5))
glGenTextures(1和textureTBO)
glBindTexture(GLenum(GL_TEXTURE_2D),textureTBO)
glTexParameteri(GLenum(GL_纹理_2D)、GLenum(GL_纹理_MIN_过滤器)、GL_线性)
glTexParameteri(GLenum(GL_纹理_2D)、GLenum(GL_纹理_MAG_过滤器)、GL_线性)
glTexParameteri(盂(GL_纹理_2D)、盂(GL_纹理_包裹_S)、GL_重复)
glTexParameteri(盂(GL_纹理_2D)、盂(GL_纹理_包裹_T)、GL_重复)
}
glTexImage2D(GLenum(GL_纹理_2D)、0、闪烁(GL_RGB)、256、256、0、GLenum(GL_RGBA)、GLenum(GL_无符号_INT)和位图缓冲区)
bitmapBuffer.deallocate()
}
}
LLDB输出-可选值不是零

(lldb) po context!
<CGContext 0x7b3000000300> (kCGContextTypeBitmap)
    <<CGColorSpace 0x7b1800002280> (kCGColorSpaceDeviceRGB)>
        width = 256, height = 256, bpc = 8, bpp = 32, row bytes = 2048 
        kCGImageAlphaNoneSkipLast | 0 (default byte order)
LLDB输出-徒劳的练习:做同样的事情,期待不同的结果,哈哈

(lldb) expression context?.fill(CGRect(x: 0, y: 0, width: 5, height: 5))
error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=2, address=0x7b08000c7ff0).
The process has been returned to the state before expression evaluation.

看来我发现这是可以做到的。我很感激你的想法,谢谢你

数据:&bitmapBuffer
是指向缓冲区指针的指针。将其替换为
数据:bitmapBuffer

与崩溃无关,但每个组件8位适合
UInt8

var bitmapBuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bitmapRows * bitmapColumns * floatsPerPoint)
var-bitmapBuffer=UnsafeMutablePointer.allocate(容量:bitmapRows*bitmapColumns*floatsPerPoint)

半相关但很重要:如果您发现自己在同一变量上使用
?。
超过2或3次,您可能只需打开变量一次,然后使用非可选的。通常情况下,人们在执行
self.foo=initialValue()
,然后使用具有可选类型的
self.foo
,即使
initialValue()
始终返回非可选类型。相反,最好使用一个本地的
foo
,并在完成操作后将其分配给
self.foo
。@Alexander,你是对的。请原谅我的懒惰。我只使用了一次缓冲区,因此我在问题中添加了一个
if let
,而不是一个本地变量。谢谢你的建议。数字不加起来:一个
CGFloat
s的缓冲区,
bitsPerComponent:8
bytesPerRow:bitmapColumns*floatsPerPixel*2
?最大的问题是
数据:&bitmapBuffer
,这是指向缓冲区指针的指针。将其替换为
数据:bitmapBuffer
@Willeke,删除
&
可以解决问题,谢谢!我以为我已经试过了,但显然没有。如果你写一个答案,我会给你评分。我还把多余的两个也拿了出来。
var bitmapBuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bitmapRows * bitmapColumns * floatsPerPoint)