2014-04-13 62 views
1

试图理解目标C中的内存管理。任何帮助将不胜感激。NSString内存生命周期

NSString * myString;

上面的代码是不是将内存分配给myString?如果是的话多少字节? 如果myString声明将内存分配给myString对象,那么编译器或运行时系统将如何知道字符串myString对象将接收多大的字符串。我的意思是字符串可以是任意长度的。那么应该分配多少内存?

myString =[NSString stringWithFormat:@"Testing String"]; 

当对象不再使用时会发生什么情况?在应用程序运行之前,内存会被释放还是会被myString的内容占用?

+1

您可能想尝试找到一本关于面向对象编程的优秀教科书,并研究* object *和* pointer *之间*非常重要的区别。许多想成为程序员的人是这个主题的创始人。 (你真的不应该尝试Objective-C编程,除非你清楚地了解它们之间的区别。) –

回答

4

NSString *myString;不分配字符串。相反,它保留足够的字节来将指针保存为字符串;该指针的生命周期取决于代码行放置的位置(并且不可控制)。

myString =[NSString stringWithFormat:@"Testing String"];执行分配*,并且字符串大小足够容纳从您的格式产生的字符串;在这种情况下足够用于“测试字符串”字符。

myString指针超出范围,并假设没有出现过的字符串,的任何其他副本,如果你正在使用ARC,该字符串将被释放。如果你没有使用ARC,你有责任在你完成它的时候释放它。

分配: 一般来说,一个Objective C分布看起来就像pointer = [Class alloc];并在实践中它更可能看起来像pointer = [[Class alloc] init];(或任何类的其他init*方法)。方法[NSString stringWithFormat:(NSString *), ...]是一种方便(或者完全或者本质上)[[NSString alloc] initWithFormat:(NSString *), ...]

+2

应该注意的是,经典的新手错误是做类似'NSString * myString = [[NSString alloc] init]; myString = someOtherString;',认为你需要“分配”字符串(指针),然后才能给它分配任何东西。最多alloc/init是浪费的动作;在最坏的情况下(没有ARC),它可能会造成严重的存储泄漏。 –