Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 尝试读取属性时出现错误的\u访问错误_Objective C_Swift_Metal - Fatal编程技术网

Objective c 尝试读取属性时出现错误的\u访问错误

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

嗨,我正在尝试开始学习一些金属与iOS上的swift结合。目前,我正在尝试让应用程序使用CametLayer而不是普通CALayer打开自定义UIView。我在以下行中收到错误的访问错误:
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