- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
使用 ARC,我可以将一个对象的所有强引用设置为 nil
来释放它。
对于 UnsafePointer
或 UnsafeMutablePointer
,我需要明确地管理它的内存:
let buffer = sizeof(Int8) * 4
var ptr = UnsafeMutablePointer<Void>.alloc(buffer)
defer {
ptr.destroy()
ptr.dealloc(someVal)
ptr = nil
}
但是文档对于 AutoreleasingUnsafeMutablePointer
对象是不明确的。我无法在 AutoreleasingUnsafeMutablePointer
上显式调用 destroy
或 dealloc
。
var ptr: AutoreleasingUnsafeMutablePointer<Void> = nil
defer {
ptr = nil
}
// assign something to ptr
顾名思义,它会在超出范围后自动释放,但我是否需要将 AutoreleasingUnsafeMutablePointer
设置为 nil
才能自动释放?
这是一个示例,其中我使用 AutoreleasingUnsafeMutablePointer
来获取运行时当前加载的所有类的列表。请注意,在调用 Objective-C 运行时的强大功能时,某些函数需要 AutoreleasingUnsafeMutablePointer
而不仅仅是 UnsafeMutablePointer
:
var numClasses: Int32 = 0
var allClasses: AutoreleasingUnsafeMutablePointer<AnyClass?> = nil
defer {
allClasses = nil // is this required?
}
numClasses = objc_getClassList(nil, 0)
if numClasses > 0 {
var ptr = UnsafeMutablePointer<AnyClass>.alloc(Int(numClasses))
defer {
ptr.destroy()
ptr.dealloc(Int(numClasses))
ptr = nil
}
allClasses = AutoreleasingUnsafeMutablePointer<AnyClass?>.init(ptr)
numClasses = objc_getClassList(allClasses, numClasses)
for i in 0 ..< numClasses {
if let currentClass: AnyClass = allClasses[Int(i)] {
print("\(currentClass)")
}
}
}
最佳答案
您不需要将其设置为 nil
.它应该是从一个自动释放的指针构造的(假设它构造正确,它将自行释放)。同时,不要在当前堆栈帧之后继续保留它。 AutoreleasingUnsafeMutablePointer
不会使对象保持事件状态。当封闭的自动释放池弹出时,包装的对象将被释放并可能被释放。顾名思义:它不安全。
通过从不创建 AutoreleasingUnsafeMutablePointer
来避免问题你自己在 Swift 中(编辑:除非它真的是一个 UnsafeMutablePointer 并且 C 头文件导入出错,见下文)。如果你正确使用它,它应该是 Swift 的 inout
之间的透明粘合剂。和一个 Objective-C 指针返回参数。
您通常会创建一个 var
匹配包含的类型并通过 inout
传入.
例如如果你想调用函数:
func someFunction(obj: AutoreleasingUnsafeMutablePointer<AnyObject?>)
然后你像这样调用它:
var myObject: AnyObject? = nil
someFunction(&AnyObject)
一切都会好起来的。
我不知道您应该持有 AutoreleasingUnsafeMutablePointer
的任何其他情况.我不认为你应该在 Swift 端手动构建一个,除了 nil
。 .在 Swift 中构造一个 AutoreleasingUnsafeMutablePointer
非常困难与非 nil
内容,因为自动释放的唯一方法是使用 Unmanaged
.
正在响应您的更新...
objc_getClassList
函数签名是 Swift 的自动 C 导入中的一个小故障。它错误地假定 Class *
参数应导入为 AutoreleasingUnsafeMutablePointer<AnyObject?>
.你真的只需要一个 UnsafeMutablePointer
你可以从一个数组中得到:
var allClasses = Array<AnyClass?>(count: Int(objc_getClassList(nil, 0)), repeatedValue: nil)
allClasses.withUnsafeMutableBufferPointer { (inout bp: UnsafeMutableBufferPointer<AnyClass?>) in
objc_getClassList(AutoreleasingUnsafeMutablePointer(bp.baseAddress), Int32(allClasses.count))
}
关于swift - 是否有必要取消分配 AutoreleasingUnsafeMutablePointer?如果是这样,如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36186540/
我正在使用 this solution在二进制矩阵中找到与图像边界对齐的矩形。假设现在我想找到一个不与图像边框对齐的矩形,并且我不知道它的方向;找到它的最快方法是什么? 为了示例,让我们寻找一个仅包含
else: 行在这个 Python 程序中是否正确/必要? from random import randrange for n in range(10): r = randrange(0,1
在 TDPL 7.1.5.1 中讨论了将 Widget w2 分配给 w1 并且作者指出“将 w2 逐个字段分配给 w1 会将 w2.array 分配给 w1.array——一个简单的数组边界分配,而
我是一名优秀的程序员,十分优秀!