ios – Swift vs Objective C指针 *** 作问题

ios – Swift vs Objective C指针 *** 作问题,第1张

概述我在Objective C中有这个代码可以正常工作: list = controller->audioBufferList;list->mBuffers[0].mDataByteSize = inNumberFrames*kSampleWordSize;list->mBuffers[1].mDataByteSize = inNumberFrames*kSampleWordSize; 它工作得很 我在Objective C中有这个代码可以正常工作:

List = controller->audiobufferlist;List->mBuffers[0].mDataByteSize = inNumberFrames*kSampleWordSize;List->mBuffers[1].mDataByteSize = inNumberFrames*kSampleWordSize;

它工作得很棒,它更新了mBuffers [0]&的mDataByteSize字段. mBuffers [1].我尝试在Swift中翻译它但它不起作用:

public var audiobufferlist:UnsafeMutableaudiobufferlistPointer

在功能上,

let ListPtr = controller.audiobufferlist.unsafeMutablePointerlet buffers = UnsafeBufferPointer<AudioBuffer>(start: &ListPtr.pointee.mBuffers,count: Int(ListPtr.pointee.mNumberBuffers))for var buf in buffers {    buf.mDataByteSize = inNumberFrames * UInt32(sampleWordSize)    NSLog("Data byte size \(buf.mDataByteSize)")}for buf in buffers {    NSLog("Data byte size \(buf.mDataByteSize)")}

mDataByteSize未更新. NSLog在第二次读回环时指向原始值,而不是更新的值.似乎var buf通过制作副本来指代另一个buf.我如何解决它?这是一个纯粹的Swift语言问题,我无法理解.

编辑:正如马丁所指出的那样,我通过修改for循环修复了这个问题

for i in 0..<Int(ListPtr.pointee.mNumberBuffers) {    buffers[i].mDataByteSize = inNumberFrames * UInt32(sampleWordSize)}

现在它有效.但这进一步激起了我对Swift语言的好奇心,它是多么直观,对使用指针 *** 纵东西的开发人员来说是多么恼人.为什么以下循环失败? var缓冲区是否按值复制?

for buf in buffers {         var buffer = buf         buffer.mDataByteSize = inNumberFrames * UInt32(sampleWordSize)     }

要么

for var buf in buffers {        buf.mDataByteSize = inNumberFrames * UInt32(sampleWordSize)    }

编辑2:Hamish的回答引起了对在任何地方使用ListPtr的有效性的怀疑.我在一些调用中使用ListPtr,例如:

let status = AudioUnitRender(controller.audioUnit!,ioActionFlags,inTimeStamp,inBusNumber,inNumberFrames,ListPtr)

我现在需要知道我们在哪里可以使用ListPtr以及我们不能使用的地方!

解决方法 致电:

let buffers = UnsafeBufferPointer<AudioBuffer>(start: &ListPtr.pointee.mBuffers,count: Int(ListPtr.pointee.mNumberBuffers))

& ListPtr.pointee.mBuffers生成一个临时指针,仅在调用UnsafeBufferPointer的初始化程序时有效.因此,尝试使用缓冲区指针会导致未定义的行为(Swift 5.1中的编译器will hopefully warn on such cases).

相反,您可以直接在UnsafeMutableaudiobufferlistPointer上进行迭代,因为它符合MutableCollection.

例如:

for index in audiobufferlist.indices {  audiobufferlist[index].mDataByteSize = inNumberFrames * UInt32(sampleWordSize)  print("Data byte size \(audiobufferlist[index].mDataByteSize)")}for buffer in audiobufferlist {  print("Data byte size \(buffer.mDataByteSize)")}
总结

以上是内存溢出为你收集整理的ios – Swift vs Objective C指针 *** 作问题全部内容,希望文章能够帮你解决ios – Swift vs Objective C指针 *** 作问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1068251.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-26
下一篇2022-05-26

发表评论

登录后才能评论

评论列表(0条)

    保存