我的代码snipet如下......:
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
Run Code Online (Sandbox Code Playgroud)
...不再使用以下错误编译,我不明白:
"'init' is unavailable: use 'withMemoryRebound(to:capacity:_)' to temporarily view memory as another layout-compatible type."
Run Code Online (Sandbox Code Playgroud)
该怎么做才能修复它?
在调用以下代码时,尝试将"self"传递给swift中的C函数:
var callbackStruct : AURenderCallbackStruct =
AURenderCallbackStruct.init(
inputProc: recordingCallback,
inputProcRefCon: UnsafeMutablePointer<Void>
)
Run Code Online (Sandbox Code Playgroud)
在这里将"self"转换为UnsafeMutablePointer类型的理想方法是什么?
我以前在Swift 4.2中使用以下代码来生成ID:
public static func generateId() throws -> UInt32 {
let data: Data = try random(bytes: 4)
let value: UInt32 = data.withUnsafeBytes { $0.pointee } // deprecated warning!
return value // + some other stuff
}
Run Code Online (Sandbox Code Playgroud)
withUnsafeBytes在Swift 5.0上已弃用。我该如何解决?
更新到 Swift 5.2 / Xcode 11.4 后收到以下代码警告:
extension Data {
init<T>(from value: T) {
var value = value
let pointer = UnsafeBufferPointer(start: &value, count: 1)
self.init(buffer: pointer)
}
func to<T>(type: T.Type) -> T {
return self.withUnsafeBytes { $0.load(as: T.self) }
}
}
Run Code Online (Sandbox Code Playgroud)
在线let pointer = UnsafeBufferPointer(start: &value, count: 1)我得到了
'UnsafeBufferPointer' 的初始化导致悬空的缓冲区指针
我可以使用@silenceWarning,但这是一个肮脏的解决方案。也许我需要将指针存储在某处并在将来清理它?
我正在寻找在Swift中实现合理的C互操作性的最简单方法,而我当前的块正在将UnsafePointer<Int8>(它是a const char *)转换为[Int8]数组.
目前,我有一个天真的算法,可以采用一个UnsafePointer和多个字节,并逐个元素地将其转换为数组:
func convert(length: Int, data: UnsafePointer<Int8>) {
let buffer = UnsafeBufferPointer(start: data, count: length);
var arr: [Int8] = [Int8]()
for (var i = 0; i < length; i++) {
arr.append(buffer[i])
}
}
Run Code Online (Sandbox Code Playgroud)
循环本身可以通过使用来加速arr.reserveCapacity(length),但这不会消除循环本身的问题.
我知道这个SO问题涵盖了如何转换UnsafePointer<Int8>为String,但String完全是一个不同的野兽[T].是否有一种方便的Swift方式将长度字节从一个复制UnsafePointer<T>到一个[T]?我更喜欢纯粹的Swift方法,而不是通过NSData或类似的.如果上述算法真的是唯一的方法,我很乐意坚持下去.
如何通过C API(Core Audio等)将UnsafeMutableRawPointer(Swift 3中的新增内容)指向的内存访问字节(或Int16,浮点数等)移交给Swift函数
我有一个收据验证类,自Swift 3发布以来已弃用.我解决了一些问题,但我还有很多......
这是我使用的GitHub源代码:https://gist.github.com/baileysh9/4386ea92b047d97c7285#file-parsing_productids-swift和https://gist.github.com/baileysh9/eddcba49d544635b3cf5
第一个错误:
var p = UnsafePointer<UInt8>(data.bytes)
Run Code Online (Sandbox Code Playgroud)编译器抛出:无法使用类型UnsafeRawPointer的参数列表调用类型UnsafePointer(UInt8)的初始化程序
第二个错误
while (ptr < end)
Run Code Online (Sandbox Code Playgroud)二进制运算符<不能应用于两个UnsafePointer(UInt8)操作数
非常感谢你提前:)
编辑
感谢LinShiwei的回答,我找到了UnsafePointer声明的解决方案.它编译但尚未测试(因为其他错误避免我测试):
func getProductIdFromReceipt(_ data:Data) -> String?
{
let tempData: NSMutableData = NSMutableData(length: 26)!
data.withUnsafeBytes {
tempData.replaceBytes(in: NSMakeRange(0, data.count), withBytes: $0)
}
var p: UnsafePointer? = tempData.bytes.assumingMemoryBound(to: UInt8.self)
Run Code Online (Sandbox Code Playgroud) 例如,如果我要编写此代码:
var t = time_t()
time(&t)
let x = localtime(&t) // returns UnsafeMutablePointer<tm>
println("\(x.memory.tm_hour): \(x.memory.tm_min): \(x.memory.tm_sec)")
Run Code Online (Sandbox Code Playgroud)
......是否还需要做以下事情?
x.destroy()
x.dealloc(1)
Run Code Online (Sandbox Code Playgroud)
或者我们没有分配内存,因此不需要解雇它?
如果我们想象一个函数返回一个UnsafeMutablePointer:
func point() -> UnsafeMutablePointer<String> {
let a = UnsafeMutablePointer<String>.alloc(1)
a.initialize("Hello, world!")
return a
}
Run Code Online (Sandbox Code Playgroud)
调用此函数将导致指向一个永远不会被销毁的对象的指针,除非我们自己做脏工作.
我在这里问的问题是:从一个localtime()呼叫收到的指针有什么不同吗?
模拟器和操场都使我们能够向dealloc(1)返回的指针发送一个调用,但是我们应该这样做还是稍后通过其他方法对返回的指针进行解除分配?
目前我错误地认为我们确实需要销毁和释放.
最后的假设是错误的.我不需要发布,因为我没有创建对象.
我在Apple dev论坛上收到了相同查询的一些答案.
一般来说,你的问题的答案是肯定的.如果你收到一个指向你将负责在C中释放的内存的指针,那么你仍然有责任在从swift调用时释放它... [但]在这种特殊情况下你不需要做任何事情.(JQ)
例程本身为结果维护静态内存,您不需要释放它们.(如果你这样做可能会是一件"坏事")...一般来说,你不知道是否需要释放UnsafePointer所指向的东西....它取决于指针获取其值的位置.(ST)
UnsafePointer的dealloc()与free()不兼容.将alloc()与dealloc()和malloc和co配对.用free().如前所述,您正在调用的函数应该告诉您是否是您对释放结果的响应...只有在指针引用的内存中有非平凡的内容*时才需要destroy(),例如强引用或Swift结构或枚举.一般来说,如果它来自C,你可能不需要销毁()它.(事实上,你可能不应该销毁()它,因为它没有被Swift初始化.)......*"非平凡的内容"并不是官方的Swift术语.我正在使用类比C++概念"平凡可复制"(虽然不一定是"微不足道").(STE)
我现在写了一篇博客文章,概述了关于发布不安全指针的发现和假设,这些指针从StackOverflow,Apple Dev论坛,Twitter和Apple关于分配内存和释放它的旧文档(ARC之前)获取信息.看到这里.
我想得到数组中第一个条目的指针.这就是我尝试的方式
int[] Results = { 1, 2, 3, 4, 5 };
unsafe
{
int* FirstResult = Results[0];
}
Run Code Online (Sandbox Code Playgroud)
获取以下编译错误.任何想法如何解决它?
您只能在固定语句初始值设定项中获取未固定表达式的地址
有没有办法将Swift结构的地址强制转换为void UnsafeMutablePointer?
我尝试了这个没有成功:
struct TheStruct {
var a:Int = 0
}
var myStruct = TheStruct()
var address = UnsafeMutablePointer<Void>(&myStruct)
Run Code Online (Sandbox Code Playgroud)
谢谢!
编辑:
我实际上尝试移植到Swift 的上下文是Learning CoreAudio中的第一个示例.
这是我到目前为止所做的事情:
func myAQInputCallback(inUserData:UnsafeMutablePointer<Void>,
inQueue:AudioQueueRef,
inBuffer:AudioQueueBufferRef,
inStartTime:UnsafePointer<AudioTimeStamp>,
inNumPackets:UInt32,
inPacketDesc:UnsafePointer<AudioStreamPacketDescription>)
{ }
struct MyRecorder {
var recordFile: AudioFileID = AudioFileID()
var recordPacket: Int64 = 0
var running: Boolean = 0
}
var queue:AudioQueueRef = AudioQueueRef()
AudioQueueNewInput(&asbd,
myAQInputCallback,
&recorder, // <- this is where I *think* a void pointer is demanded
nil,
nil,
UInt32(0),
&queue)
Run Code Online (Sandbox Code Playgroud)
我正在努力留在Swift,但如果事实证明这是一个问题而不是一个优势,我将最终链接到一个C函数. …
unsafe-pointers ×10
swift ×7
casting ×2
swift3 ×2
allocation ×1
arrays ×1
c ×1
c# ×1
dealloc ×1
deprecated ×1
destroy ×1
ios ×1
pointers ×1
swift5.2 ×1
xcode11.4 ×1
xcode8-beta6 ×1