Swift 将自己投射到不可女性化的指针<;无效>;导致EXC_指令错误

Swift 将自己投射到不可女性化的指针<;无效>;导致EXC_指令错误,swift,macos,cocoa,midi,coremidi,Swift,Macos,Cocoa,Midi,Coremidi,我正在开发一个Swift应用程序,在这个应用程序中,我使用来自特定设备的MIDI信号并使用它。例如:我想根据输入信号移动NSSlider的值。因此,我所做的是创建一个MIDI输入流(可以工作),现在我需要做的是获取该值并将其设置为self.wave\u mode\u slider?.integerValue 我的输入连接方法如下: func makeInputSource() { var midiClient : MIDIClientRef = 0 var inPort : MI

我正在开发一个Swift应用程序,在这个应用程序中,我使用来自特定设备的MIDI信号并使用它。例如:我想根据输入信号移动NSSlider的值。因此,我所做的是创建一个MIDI输入流(可以工作),现在我需要做的是获取该值并将其设置为
self.wave\u mode\u slider?.integerValue

我的输入连接方法如下:

func makeInputSource() {
    var midiClient : MIDIClientRef = 0
    var inPort : MIDIPortRef = 0
    var observer = UnsafeRawPointer(Unmanaged.passUnretained(self).toOpaque())

    MIDIClientCreate("WobClient" as CFString, nil, nil, &midiClient)
    MIDIInputPortCreate(midiClient, "WobClient_InPort" as CFString, {
        (pktList: UnsafePointer<MIDIPacketList>, readProcRefCon: UnsafeMutableRawPointer?, srcConnRefCon: UnsafeMutableRawPointer?) -> Void in
        let packetList : MIDIPacketList = pktList.pointee
        var packet : MIDIPacket = packetList.packet
        let mySelf = Unmanaged<Wob>.fromOpaque(readProcRefCon!).takeUnretainedValue()

        for _ in 1...packetList.numPackets {
            let bytes = Mirror(reflecting: packet.data).children
            var params : [UInt64] = []

            var i = packet.length
            for (_, attr) in bytes.enumerated() {
                let string = String(format: "%02X ", attr.value as! UInt8)
                params.append(UInt64(strtoul(string, nil, 16)))
                i -= 1

                if (i <= 0) {
                    break
                }
            }

            mySelf.wave_mode_slider?.integerValue = ("\(params[2])" as NSString).integerValue
            packet = MIDIPacketNext(&packet).pointee
        }

    }, nil, &inPort)

    MIDIPortConnectSource(inPort, self.source, &observer)
}
但是,这会导致在声明
imf
的行上出现
EXC\u BAD\u指令

我还尝试使用
保留的
变体,但这导致了相同的
EXC\u BAD\u指令

现在,我不是一个经验丰富的swift开发人员,尤其是在这方面,所以我可能错过了一些明显的东西,所以有人知道为什么会发生这种情况吗

谢谢

编辑----正如建议的那样,我稍微修改了代码

MIDIPortConnectSource(inPort, self.source, &observer)
变成

MIDIPortConnectSource(inPort, self.source, observer)
这也使得我在Swift 4(接收抄送)上将
observer
变量更改为
unsafemtablerawpointer

@objc func receiveMIDI(uu发送方:UIButton){
let observer=unsafemeutablerawpointer(Unmanaged.passUnretained(self.toOpaque())
midclientcreate(s、nil、nil和midclient);
MIDIInputPortCreate(midiClient,p{
(pktList:UnsafePointer,
中的readProcRefCon:UnsafemeutableRawPointer?,srcConnRefCon:UnsafemeutableRawPointer?)
//回调块
let packetList:MIDIPacketList=pktList.pointee
var packet:MIDIPacket=packetList.packet
对于uu1…packetList.numPackets{
let bytes=Mirror(反射:packet.data).children
var dumpStr=“”
var i=数据包长度
for(1;,attr),以字节为单位。枚举(){
dumpStr+=字符串(格式:“%02d”,属性值为!UInt8)
i-=1

如果(我应该是
MIDIPortConnectSource(inPort,self.source,observer)
,没有
&
——正如我在:)上所建议的那样@MartinR Haha遗漏了这一点!我会更新代码,因为这个问题留给我,当然,如果你传递
observer
的内容或该变量的地址,这会有所不同。@MartinR Edited,:)更改后问题仍然存在?是否
print(observer)
print(readProcRefCon!)
显示相同的地址?
MIDIPortConnectSource(inPort, self.source, observer)
@objc func receiveMIDI(_ sender: UIButton) {

    let observer = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())
    MIDIClientCreate(s, nil, nil, &midiClient);
    MIDIInputPortCreate(midiClient, p, {
    (pktList: UnsafePointer<MIDIPacketList>,
        readProcRefCon: UnsafeMutableRawPointer?, srcConnRefCon: UnsafeMutableRawPointer?) in
            // callback block
            let packetList:MIDIPacketList = pktList.pointee
            var packet:MIDIPacket = packetList.packet

            for _ in 1...packetList.numPackets{
                let bytes = Mirror(reflecting: packet.data).children
                var dumpStr = ""


                var i = packet.length
                for (_, attr) in bytes.enumerated(){
                        dumpStr += String(format:"%02d ", attr.value as! UInt8)
                        i -= 1
                        if (i <= 0)
                        {
                            break
                        }
                }
                let midi = dumpStr.split(separator: " ", maxSplits: 2, omittingEmptySubsequences: true)
                var midiIntValues = [Int(midi[0]),Int(midi[1]),Int(midi[2].trimmingCharacters(in: .whitespaces))]
                if let src = srcConnRefCon{
                    let mySelf = Unmanaged<DetailViewController>.fromOpaque(src).takeUnretainedValue()
                    if let v = midiIntValues[2]{
                       // print("control \(midiIntValues[1]) has \(v) value")
                    }

                }
                packet = MIDIPacketNext(&packet).pointee
            }
            // end callback block
        }, nil, &inputPort);

    let sourceCount = MIDIGetNumberOfSources()
    print("source count \(sourceCount)")

    for srcIndex in 0 ..< sourceCount {
        var source = MIDIGetSource(srcIndex)
        let status = MIDIPortConnectSource(inputPort,source,observer)
        if status == noErr {
            print("Connected to inputPort")
        } else {
            print("There was an error connecting the ports!")
        }
    }
}