我来自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
答案 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。