2011-07-19 83 views
0

我在Objective-C的几个星期开始编程,现在,我认为它的时间,我认为更多关于我的记忆管理,所以我有一对夫妇的情况下,我想对澄清。内存管理问题

NSString *myString = @"Hello, World"; 

如果我要到下一行做

NSString *anotherString = myString; 

是它得到复制?或者是另一个字符串只是一个指向myString的指针?如果它只是一个指针我怎么会让anotherString的myString的副本都有自己的内存?

什么,如果我是

[anotherString release]; 

实际上得到释放什么,只是anotherString,或做的myString走吗?

然后如果我做

anotherString = nil; 

是否实际释放内存,并使用或者它仍然有空分配的内存空间?显然,指针仍然可以使用。它对myString有什么作用?

这将真正帮助我成为妥善管理的内存更好,而不是仅仅[object release];随机导致崩溃。

非常感谢你事先谁回复。

回答

2

当你这样做:

NSString *myString = @"Hello, World"; 
NSString *anotherString = myString; 

...你创建一个单一NSString实例,两个指针给它。因此,要回答你的问题,没有它不被复制。是的,anotherString只是一个指针,myString也是如此,实际的NSString实例在内存区域中,在两个指针现在指向的地址处于关闭状态。

为了使字符串的副本,你会怎么做:

NSString *anotherString = [myString copy]; 

当你这样做:

[anotherString release]; 

NSString实例anotherString点被释放。 anotherString本身没有任何反应。它继续指向你现在失效的对象实例。如果myString指向相同的实例,那么是的,这也导致myString也“消失”。

如果你这样做:

anotherString = nil; 

...那么你已经引起了内存泄漏,因为你重新分配指针没有释放它指向的东西。除非在这种情况下,因为@"Hello, World"是加载到堆栈并且不被代码保留的字面值。

在任何情况下,将anotherString设置为nil对您的字符串不起任何作用,它只是改变anotherString指向的内容。您的实际NSString实例仍然处于内存区域中,完全没有意识到您只是抛弃了对它的引用(可能的例外:引用计数/垃圾收集环境)。

是的,随机调用[object release]会导致崩溃。作为一般规则,你应该只调用release上的东西,如果:

  1. 你叫allocinit...就可以了。
  2. 你叫它retain就可以了。
  3. 由于在某个其他对象上调用了copy,您获得了该对象。

注意,这些堆栈,因此,如果您alloc东西,retain,然后copy它,你需要有3个电话给release,二为对象,您alloc“版,以及一个用于复制。

作为一个侧面说明,你可能会发现它更清晰的写你的对象声明,如:

NSString* myString = @"Hello, World"; 
NSString* anotherString = myString; 

...这使得它更明显的是,你所宣称的指向的NSString的而不是NSString的的他们自己。我个人认为你的原始语法虽然常用,但也是backwards

+0

非常感谢你,为我解决了这个问题。 – Weston

0

此字符串:

NSString *myString = @"Hello, World"; 

是在栈上创建。它在应用程序启动时加载到内存中。你没有自己的内存支持的对象,因此,不应该将其释放。

如果你想将一个字符串复制到堆(在这里您可以管理内存),你只需做到这一点:

NSString *anotherString = [myString copy]; 

那么你负责释放该对象当你与完成它。

[anotherString release]; 

设置指向nil的指针只是清除指针,而不是它指向的对象。它仍然在记忆中。

0

NSString * anotherString = myString;

---这只是一个指针赋值

---你可以复制使用[myString的副本]

[anotherString发布] MyString的;

---你释放anotherString的所有权(请阅读有关保留计数的概念)

anotherString =零;

---你只是将指针分配给任何东西。

我建议请阅读更多关于内存管理的苹果文档...