- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
/// 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()
术语object
、memory
和value
在此上下文中是什么意思?
最佳答案
当您进行自己管理内存而不是让语言运行时为您处理的低级编程时,使用内存是一个两阶段过程。
首先,您分配一个内存区域。这只是保留了一些原始空间 block ,并没有将内存设置为具有任何特定值。内存可能包含随机垃圾,或者它可能包含以前位于该内存位置的一些数据。您永远不应依赖此内存区域具有任何特定值。
然后通过将该内存区域设置为某个明确定义的值来初始化它。也许您将其设置为全零。也许您将它分成 block 并将这些 block 视为保存在内存中的单独变量。也许您从其他地方复制了一些数据。
如果您使用的是像 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)
显然,使用 UnsafeMutablePointer
这样的名称,如果您不知道自己在做什么,使用它仍然很危险。但它仍然比没有这种帮助程序直接访问内存安全得多。
关于ios - 关于 UnsafeMutablePointer 的 destroy() 的术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27670643/
我正在使用 Swift 的 C API,对于我需要调用的方法之一,我需要给出一个 UnsafeMutablePointer>> 更多信息: 快速界面: public func presage_pred
函数: public func OSAtomicCompareAndSwapPtr(_ __oldValue: UnsafeMutableRawPointer!, _ __newValue: Unsa
我正在尝试使用 NSView 的 getRectsBeingDrawn,但我不太确定如何转换它需要的变量。 它的定义是: func getRectsBeingDrawn(rects: UnsafeMu
更新到 Swift 3 后,我的代码出现了一些问题。我在转换之前有这段代码: extension NSData { func castToCPointer() -> T { let mem
我真的被一个愚蠢但看似简单的问题弄疯了......我必须将 Data 转换为 AVAudioPCMBuffer。 寻找this question这似乎很容易,但随着 Swift 3 的出现,一切都发生
我需要使用一个使用 UnsafeMutablePointer?>! 的函数作为参数。它是用 Objective-C++ 框架编写的,我通过桥接 header 访问它: - (void) applyFi
我的 Swift 项目中有这个 EZAudio 方法,用于从麦克风捕获音频: func microphone(microphone: EZMicrophone!, hasAudioReceived b
我刚开始弄乱图像处理,我遇到了几个非常奇怪的问题,或者至少我认为是这样。我假设我犯了一些非常愚蠢的错误。 我本来打算就此发布另一个问题,但是使用下面的代码有时我也会得到随机噪声,而不是用户抽取数字的像
在main.swift文件,我们调用了我们的收据检查系统(由 Receigen 生成)。在 Swift 2 中,main.swift阅读: startup(Process.argc, UnsafeMu
我在 Swift 中创建了一个名为 RGB 的结构,非常简单: struct PixelRGB { var r: CUnsignedChar = 0 var g: CUnsignedC
我正在使用 SceneKit 的 SCNParticleSystem 构建一个测试应用程序。它有一个回调,可让您修改每个帧上的粒子属性。这个回调的签名是 typealias SCNParticleMo
Accelerate 框架的 Swift 签名 vDSP_biquadm()函数包括 UnsafeMutablePointer> 的参数类型和 UnsafeMutablePointer> . 如何在
请帮助语法: __weak typeof (self) weakSelf = self; [self.audioFile getWaveformDataWithCompletionBlock:^(fl
这段代码在 Swift2.3 中运行良好,现在我将其转换为 Swift3。所以我收到这个错误。有人知道如何解决这个问题吗? var cmdLnConf: OpaquePointer? filepriv
我构建了一个小结构,其中包含伪 C 字符串 UnsafeMutablePointer。现在我想添加一种方法来获取字符串的长度,但有些行为非常奇怪: struct Char { let valu
1. let context = CGContext(...) 2. context.draw(...) 3. let buffer = UnsafeMutablePointer(context.da
在 C 中,我有以下代码来分配一个具有适当大小的 AudioBufferList,然后用相关数据填充它。 AudioObjectPropertyScope scope = mIsInput ? kAu
我正在尝试将我的 Swift 2 代码转换为最新的语法 (Swift 3)。我收到以下错误: Cannot invoke initializer for type 'UnsafeMutablePoin
var a = [1,2,3] let ptr1 = UnsafeMutablePointer(&a[0]) //works fine let index = 0 let ptr2 = UnsafeM
在我创建的结构中(在Xcode 10.1,Swift 4.2上)观察到的属性上使用UnsafeMutablePointer时,出现了一些意外的行为。请参阅以下游乐场代码: struct NormalT
我是一名优秀的程序员,十分优秀!