小编ske*_*ech的帖子

如果一个函数返回一个UnsafeMutablePointer,我们有责任销毁和释放吗?

例如,如果我要编写此代码:

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)

或者我们没有分配内存,因此不需要解雇它?


更新#1:

如果我们想象一个函数返回一个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)返回的指针发送一个调用,但是我们应该这样做还是稍后通过其他方法对返回的指针进行解除分配?

目前我错误地认为我们确实需要销毁和释放.

更新#1.1:

最后的假设是错误的.我不需要发布,因为我没有创建对象.


更新#2:

我在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之前)获取信息.看到这里.

allocation unsafe-pointers dealloc destroy swift

16
推荐指数
1
解决办法
5101
查看次数

有没有正确的方法来确定NSNumber是使用Swift从Bool派生的?

包含Bool的NSNumber很容易与可以包装在NSNumber类中的其他类型混淆:

NSNumber(bool:true).boolValue // true
NSNumber(integer: 1).boolValue // true
NSNumber(integer: 1) as? Bool // true
NSNumber(bool:true) as? Int // 1

NSNumber(bool:true).isEqualToNumber(1) // true
NSNumber(integer: 1).isEqualToNumber(true) // true
Run Code Online (Sandbox Code Playgroud)

但是,保留了有关其原始类型的信息,我们可以在此处看到:

NSNumber(bool:true).objCType.memory == 99 // true
NSNumber(bool:true).dynamicType.className() == "__NSCFBoolean" // true
NSNumber(bool:true).isEqualToValue(true) || NSNumber(bool:true).isEqualToValue(false) //true
Run Code Online (Sandbox Code Playgroud)

问题是:这些方法中的哪一种是确定Bool何时被包裹在NSNumber中而不是其他内容的最佳(和/或最安全)方法?都一样有效吗?或者,还有另一种更好的解决方案吗?

cocoa nsnumber swift

12
推荐指数
1
解决办法
1720
查看次数

标签 统计

swift ×2

allocation ×1

cocoa ×1

dealloc ×1

destroy ×1

nsnumber ×1

unsafe-pointers ×1