理解目标中的参考c

时间:2011-06-26 20:34:31

标签: objective-c actionscript-3

我来自AS3背景。在AS3中,当您将对象分配给var时,不将对象复制到var,var将成为对象的引用。

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,AFAIK中,当你将某个对象分配给另一个对象的某个属性时,“对象被复制。我的困惑来自于使用temp对象后你可以释放它。

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

...如果你能释放它意味着你不再需要它了。所以它被复制了?或者myLabel中的“text”属性是对myString的引用?

你可以猜到我刚刚开始在Objective C的世界里。

TIA

3 个答案:

答案 0 :(得分:6)

没有。 Objective-C也使用引用(这就是为什么你在每个类名之后看到*,它实际上是一个指针)。但是,Obj-C还有一个内存管理系统。执行myString = [[NSMutableString alloc] ...]时,您正在创建一个“拥有”的新字符串。但是当你拨打[myLabel setText:myString]时,标签会保留字符串并有效地获得所有权。因此,当您调用[myString release]时,您放弃了所有权,但由于标签仍具有所有权,因此该字符串实际上不会从内存中释放。

我建议您阅读Memory management programming guide以获取更多信息。

答案 1 :(得分:0)

释放myString是正确的做法。

myLabel将保留字符串,现在负责释放它。

答案 2 :(得分:0)

它是对象的引用,当您将其分配给标签时,保留计数会在字符串上出现,因此您“释放”本地引用,以便在处理标签时清除字符串。

有关详细信息,请参阅Apple Memory Management Guide