Objective c 尝试读取属性时出现错误的\u访问错误
嗨,我正在尝试开始学习一些金属与iOS上的swift结合。目前,我正在尝试让应用程序使用CametLayer而不是普通CALayer打开自定义UIView。我在以下行中收到错误的访问错误:Objective c 尝试读取属性时出现错误的\u访问错误,objective-c,swift,metal,Objective C,Swift,Metal,嗨,我正在尝试开始学习一些金属与iOS上的swift结合。目前,我正在尝试让应用程序使用CametLayer而不是普通CALayer打开自定义UIView。我在以下行中收到错误的访问错误:self.metalLayer.device=self.device 下面的代码是UIView的一个子类,它是从故事板而不是普通UIView加载的。我遵循下面的例子,在objective-C中,我试图在swift中实现同样的目标。现在有点不知所措。有什么想法吗 import UIKit import Metal
self.metalLayer.device=self.device
下面的代码是UIView的一个子类,它是从故事板而不是普通UIView加载的。我遵循下面的例子,在objective-C中,我试图在swift中实现同样的目标。现在有点不知所措。有什么想法吗
import UIKit
import Metal
class MBEMetalView: UIView {
var device: MTLDevice
var metalLayer: CAMetalLayer {
return CAMetalLayer(layer: self.layer)
}
override class func layerClass() -> AnyClass {
return CAMetalLayer.self
}
required init?(coder aDecoder: NSCoder) {
self.device = MTLCreateSystemDefaultDevice()!
super.init(coder: aDecoder)
self.metalLayer.device = self.device
self.metalLayer.pixelFormat = MTLPixelFormat.BGRA8Unorm
}
override func didMoveToWindow() {
self.redraw()
}
func redraw() {
var drawable: CAMetalDrawable? = self.metalLayer.nextDrawable()
var texture: MTLTexture? = drawable?.texture
var passDescriptor: MTLRenderPassDescriptor = MTLRenderPassDescriptor.self()
passDescriptor.colorAttachments[0].texture = texture
passDescriptor.colorAttachments[0].loadAction = MTLLoadAction.Clear
passDescriptor.colorAttachments[0].storeAction = MTLStoreAction.Store
passDescriptor.colorAttachments[0].clearColor = MTLClearColor.init(red: 1, green: 0, blue: 0, alpha: 1)
var commandQueue: MTLCommandQueue = self.device.newCommandQueue()
var commandBuffer: MTLCommandBuffer = commandQueue.commandBuffer()
var commandEncoder: MTLCommandEncoder = commandBuffer.renderCommandEncoderWithDescriptor(passDescriptor)
commandEncoder.endEncoding()
commandBuffer.presentDrawable(drawable!)
commandBuffer.commit()
}
}
@alex_p告诉我,我的metalLayer只读可计算函数在每次调用它时都会给我一个新的CametLayer,因此我更改了代码,但现在我得到以下SIGABRT错误
/BuildRoot/Library/Caches/com.apple.xbs/Sources/Metal/Metal-55.1.1/ToolsLayers/Debug/MTLDebugDevice.mm:629:失败的断言“iosurface不得为零”。
在以下行:var drawable:CAMetalDrawable?=self.metalLayer.nextDrawable()
我目前的代码是:
import UIKit
import Metal
class MBEMetalView: UIView {
var device: MTLDevice? = MTLCreateSystemDefaultDevice()
var metalLayer: CAMetalLayer = CAMetalLayer()
var commandQueue: MTLCommandQueue! = nil
override class func layerClass() -> AnyClass {
return CAMetalLayer.self
}
required init?(coder aDecoder: NSCoder) {
self.commandQueue = self.device!.newCommandQueue()
super.init(coder: aDecoder)
self.metalLayer.device = self.device
self.metalLayer.pixelFormat = MTLPixelFormat.BGRA8Unorm
}
override func didMoveToWindow() {
self.redraw()
}
func redraw() {
var drawable: CAMetalDrawable? = self.metalLayer.nextDrawable()
let texture: MTLTexture? = drawable!.texture
let passDescriptor: MTLRenderPassDescriptor = MTLRenderPassDescriptor.self()
passDescriptor.colorAttachments[0].texture = texture
passDescriptor.colorAttachments[0].loadAction = MTLLoadAction.Clear
passDescriptor.colorAttachments[0].storeAction = MTLStoreAction.Store
passDescriptor.colorAttachments[0].clearColor = MTLClearColor.init(red: 1, green: 0, blue: 0, alpha: 1)
let commandBuffer: MTLCommandBuffer = commandQueue.commandBuffer()
let commandEncoder: MTLCommandEncoder = commandBuffer.renderCommandEncoderWithDescriptor(passDescriptor)
commandEncoder.endEncoding()
commandBuffer.presentDrawable(drawable!)
commandBuffer.commit()
}
}
您是否检查了
self.metalLayer.device
是否为nil?您在这里做了一件非常奇怪的事情var metalLayer:camertallayer{return camertallayer(layer:self.layer)}
,事实上每次访问变量时,您都返回指向新对象的指针,它基本上不能在您的环境中正常工作case@Tobonaut每当我试图这样做,我也会得到一个坏的_访问错误。但它确实与该语句有关,因为每当我尝试为metalLayer.device赋值时,都会出现错误。@alex\p您认为我使用的方法有什么不正确之处?它只是一个可计算的只读swift函数,将普通CALayer强制转换为CametLayer。这是一个计算属性,每次创建对新的CametLayer
对象(使用层创建的对象)的引用时,获取它。此处self.metalayer.device=self.device
例如,它返回对一个camertallayer
对象的引用,此处self.metalayer.pixelFormat=MTLPixelFormat.BGRA8Unorm
它返回对另一个camertallayer
对象的引用,并且您没有保留对上一个对象的引用。当您下次调用它时,它会将新引用返回到带有层的新CametLayer
对象,但不带self.device
和MTLPixelFormat.BGRA8Unorm