关于UnsafeMutablePointer的destroy()的术语

Vat*_*not 2 pointers ios swift swift-playground

/// Destroy the object the pointer points to.
///
/// Precondition: the memory is initialized.
///
/// Postcondition: the value has been destroyed and the memory must
/// be initialized before being used again.
func destroy()
Run Code Online (Sandbox Code Playgroud)

什么条款object,memoryvalue在这方面是什么意思?

Air*_*ity 9

在进行低级编程时,您自己管理内存而不是让语言运行时为您处理,使用内存是一个两阶段的过程.

首先,分配一个内存区域.这只是保留了一些原始空间,它没有将内存设置为具有任何特定值.内存可能包含随机垃圾,或者它可能包含以前在内存位置的一些数据.你永远不应该依赖这个具有任何特定价值的记忆区域.

然后通过将内存区域设置为某个明确定义的值来初始化它.也许你把它设置为全零.也许你将它分成块并将这些块视为内存中保存的单独变量.也许你从其他地方复制一些数据.

如果您使用的是Swift等高级语言,则可能需要设置内存来表示对象 - 成员变量和其他支持数据的集合.此数据集合以非常特定的方式构建,因此您可以将其作为特定对象类型传递给其他函数,并在其上调用成员方法.要设置对象,可以调用它的"init"方法来适当地设置成员变量.

这里,将存储器设置为具有"值"并在存储器中创建"对象"是类似的概念,但术语"对象"意味着在更高的抽象级别操作.

当您完成对象后,您将反过来执行相同的步骤.首先,您可以执行调用对象的去初始化代码的"高级"操作.例如,调用deinit()类的方法,或释放对其他对象的引用.

此时,内存仍然分配给你,但它又被认为是"垃圾",你不能看.但是你仍然需要"释放"内存(给它回来)以返回你开始的状态.或者,您可以选择不重复使用原始内存并在原地创建新对象.

UnsafeMutablePointer 通过简化分配和释放内存来帮助您完成此过程,但更重要的是,帮助您安全地在该内存中创建对象,并且有许多辅助方法可以移动控制该内存,从不同类型的源数据初始化等等

这是一个例子:

class MyClass {
    init() { println("created") }
    deinit { println("destroyed") }
}    
struct MyStruct {
    let i: Int
    let d: Double
    let c: MyClass
}

// allocate enough memory for 1 MyStruct object
// (you can also allocate enough memory for several objects)
var aStruct = UnsafeMutablePointer<MyStruct>.alloc(1)
// no MyStruct has been created yet – we’ve just allocated
// enough memory to hold one

// set that memory to represent a new MyStruct object
aStruct.initialize(MyStruct(i: 4, d: 2.2, c: MyClass()))
println("Memory contains a MyStruct with i = \(aStruct.memory.i)")

// should see the class print "destroyed"
aStruct.destroy()

// at this point, "memory" should be conisidered rubbish

// reinitialize it with something new:
aStruct.initialize(MyStruct(i: 8, d: 3.3, c: MyClass()))
println("Memory contains a MyStruct with i = \(aStruct.memory.i)")

// should see the class print "destroyed"
aStruct.destroy()

// finally, deallocate the raw memory
aStruct.dealloc(1)
Run Code Online (Sandbox Code Playgroud)

显然,UnsafeMutablePointer如果您不知道自己在做什么,使用它的名称仍然是危险的.但是如果没有这种帮助,它仍然比直接访问内存更安全.