2011-06-26 47 views
0

我來自AS3背景。在AS3中,當您將對象分配給var時,您不會將該對象複製到該var,則該var將成爲對該對象的引用。理解參考目標c

var myObject = new MyClass(); 
myObject.name = "Bananas"; 

var myRef = {}; 
myRef.ref = myObject; 
trace(myRef.ref.name); // Bananas 

myObject.name = "Mango"; 
trace(myRef.ref.name); // Mango 

myObject = null; 
trace(myRef.ref); // null 

在Objective C,據我所知,當你分配一些對象的其他一些屬性對象的「對象被複制。我的困惑來自於一個事實,即使用臨時對象後,就可以將其釋放。

NSMutableString* myString = [[NSMutableString alloc] initWithString:@"Hello"]; 
[myLabel setText:myString]; 
[myString release]; 

...如果你可以釋放它意味着你不需要它了,所以它被複制?或「文本」在myLabel屬性是MyString的參考?

正如您可以猜到我剛剛開始在目標C.

的世界

TIA

回答

6

不可以。Objective-C也使用引用(這就是爲什麼你在每個類名後面看到*,它實際上是一個指針)。但是,Obj-C也有一個內存管理系統。當你做myString = [[NSMutableString alloc] ...]你正在創建一個你自己的新字符串。但是當您撥打[myLabel setText:myString]時,該標籤將保留該字符串並有效取得所有權。因此,當您撥打[myString release]時,您將放棄所有權,但由於標籤仍具有所有權,因此字符串實際上不會從內存中解除分配。

我建議您閱讀Memory management programming guide瞭解更多信息。

0

釋放myString是正確的事情。

myLabel將保留該字符串,現在負責釋放它。

0

這是對象的引用,當您將它分配給標籤時,保留計數碰撞到字符串,因此您'釋放'您的本地引用,以便在處理標籤時可以清理字符串。

查看Apple Memory Management Guide瞭解更多信息。