2014-12-27 71 views
2
/// 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() 

什麼條款objectmemoryvalue意味着在這方面?有關術語UnsafeMutablePointer的destroy()

回答

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) 

顯然,像UnsafeMutablePointer一個名字,它仍然是危險的,如果你不知道你在做什麼使用。但是,如果沒有這種幫助,直接訪問內存仍然比安全更安全。

+1

因此,如果結構不包含類,可以釋放內存而不調用destroy? – matt 2014-12-27 21:22:15

+0

我的猜測是肯定的,只要它真的是惰性的?但是即使是字符串和數組也有一些需要定義的refcounted存儲......而且沒有記錄你可能仍然不太可取。 – 2014-12-27 21:42:20